From 6c8a55a0af375d0cf85366975d0abc703d9f7f6f Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 27 Mar 2019 23:41:24 +0100 Subject: [PATCH] Fix #1467: Update WholeProjectDecompiler.GetPlatformName to match Language.GetPlatformDisplayName --- .../CSharp/WholeProjectDecompiler.cs | 18 ++++++++++++------ ILSpy/Languages/Language.cs | 7 ++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs b/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs index 6261a283e..f25ded317 100644 --- a/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs @@ -474,20 +474,26 @@ namespace ICSharpCode.Decompiler.CSharp public static string GetPlatformName(Metadata.PEFile module) { var headers = module.Reader.PEHeaders; - switch (headers.CoffHeader.Machine) { + var architecture = headers.CoffHeader.Machine; + var characteristics = headers.CoffHeader.Characteristics; + var corflags = headers.CorHeader.Flags; + switch (architecture) { case Machine.I386: - if ((headers.CorHeader.Flags & CorFlags.Prefers32Bit) != 0) + if ((corflags & CorFlags.Prefers32Bit) != 0) return "AnyCPU"; - else if ((headers.CorHeader.Flags & CorFlags.Requires32Bit) != 0) + if ((corflags & CorFlags.Requires32Bit) != 0) return "x86"; - else - return "AnyCPU"; + // According to ECMA-335, II.25.3.3.1 CorFlags.Requires32Bit and Characteristics.Bit32Machine must be in sync + // for assemblies containing managed code. However, this is not true for C++/CLI assemblies. + if ((corflags & CorFlags.ILOnly) == 0 && (characteristics & Characteristics.Bit32Machine) != 0) + return "x86"; + return "AnyCPU"; case Machine.Amd64: return "x64"; case Machine.IA64: return "Itanium"; default: - return headers.CoffHeader.Machine.ToString(); + return architecture.ToString(); } } } diff --git a/ILSpy/Languages/Language.cs b/ILSpy/Languages/Language.cs index e09fadf01..a1aad8d64 100644 --- a/ILSpy/Languages/Language.cs +++ b/ILSpy/Languages/Language.cs @@ -498,9 +498,10 @@ namespace ICSharpCode.ILSpy public static string GetPlatformDisplayName(PEFile module) { - var architecture = module.Reader.PEHeaders.CoffHeader.Machine; - var characteristics = module.Reader.PEHeaders.CoffHeader.Characteristics; - var corflags = module.Reader.PEHeaders.CorHeader.Flags; + var headers = module.Reader.PEHeaders; + var architecture = headers.CoffHeader.Machine; + var characteristics = headers.CoffHeader.Characteristics; + var corflags = headers.CorHeader.Flags; switch (architecture) { case Machine.I386: if ((corflags & CorFlags.Prefers32Bit) != 0)