如何解释CorFlags标志以及如何使用它来确定 .NET 程序集是为 x86 还是 x64 构建的?
会不会是下面这个?
corflags MyAssembly.dll
Microsoft .NET 4.5引入了一个新选项Any CPU 32-bit Preferred。在新版本的 CorFlags.exe 中,不再存在 32BIT 标志,而是添加了两个新标志,32BITREQ和32BITPREF。
根据下面的解释,我们可以将新的 CorFlags 解释如下。
CPU Architecture PE 32BITREQ 32BITPREF
------------------------ ----- -------- ---------
x86 (32-bit) PE32 1 0
x64 (64-bit) PE32+ 0 0
Any CPU PE32 0 0
Any CPU 32-Bit Preferred PE32 0 1
CorFlags.exe显示的标志位于C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools
Version : Assembly's target framework. Header : 2.0/2.5 (Must have version of 2.5 or greater to run natively) PE : PE32 (32-bit)/PE32+ (64-bit) CorFlags : Hexadecimal value, computed based on below 4 flags. ILONLY : 1 if MSIL otherwise 0 32BITREQ : 1 if 32-bit x86 only assembly otherwise 0 32BITPREF : 1 if 32-bit x86 only preferred in Any CPU architecture otherwise 0 Signed : 1 if signed with strong name otherwise 0
以下示例说明了C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\CorFlags.exe
不同程序集的输出。
来自GAC_32的 PresentationCore.dll
CorFlags.exe "C:\Windows\Microsoft.NET\assembly\GAC_32\PresentationCore\v4.0_4.0.0.0__31bf3856ad364e35\PresentationCore.dll"
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 0xb
ILONLY : 1
32BITREQ : 1
32BITPREF : 0
Signed : 1
来自GAC_64的 System.Data.dll
CorFlags.exe "C:\Windows\Microsoft.NET\assembly\GAC_64\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll"
Version : v4.0.30319
CLR Header: 2.5
PE : PE32+
CorFlags : 0x18
ILONLY : 0
32BITREQ : 0
32BITPREF : 0
Signed : 1
GAC_MSIL 中的 System.dll
CorFlags.exe "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll"
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 0x9
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 1
要了解有关Any CPU 32 位首选程序集的更多信息,请参阅 What AnyCPU 对 .NET 4.5 和 Visual Studio 11 的真正含义
打开 Visual Studio 命令提示符(在 Windows 中:菜单开始/程序/Microsoft Visual
Studio/Visual Studio 工具/Visual Studio 2010 命令提示符)
CD 到包含相关 DLL 的目录
像这样运行标志:
corflags MyAssembly.dll
输出如下所示:
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 1
ILONLY : 1
32BIT : 0
Signed : 0
标志解释:
Any CPU: PE = PE32 and 32BIT = 0
x86: PE = PE32 and 32BIT = 1
64-bit: PE = PE32+ and 32BIT = 0
为了向其他答案添加更多细节,实际重要的值是十六进制 CorFlags 值,因为它携带的信息最多。这是组成它的位列表:
[Flags]
public enum CorFlags
{
ILOnly = 0x00000001,
Requires32Bit = 0x00000002,
ILLibrary = 0x00000004,
StrongNameSigned = 0x00000008,
NativeEntryPoint = 0x00000010,
TrackDebugData = 0x00010000,
Prefers32Bit = 0x00020000,
}
Corflags 分别输出该值的四位(ILONLY、32BITREQ、32BITPREF 和 Signed)。然而,完整的 CorFlags 值还包含有关程序集是强名称签名还是延迟签名(0x8 位)以及 ILLibrary、NativeEntryPoint 和 TrackDebugData 位的信息(我不知道这些是什么意思)。
请注意,CorFlags 输出Signed不完全是 StrongNameSigned 位。如果程序集是延迟签名或完全签名的,它将打印 Signed 1,而如果程序集仅是完全签名的,则设置 StrongNameSigned 位。
您还可以使用此表:
中央处理器 | 体育 | 32位 ----------|--------|------ x86 | PE32 | 1 任何 CPU | PE32 | 0 x64 | PE32+ | 0