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)