Как интерпретировать флагов CorFlags и как его использовать, чтобы определить, была ли сборка .NET построена для x86 или x64?
Может ли быть следующее?
corflags MyAssembly.dll
Как интерпретировать флагов CorFlags и как его использовать, чтобы определить, была ли сборка .NET построена для x86 или x64?
Может ли быть следующее?
corflags MyAssembly.dll
Откройте командную строку Visual Studio (в Windows: меню Пуск/Программы/Microsoft Visual
Studio/Visual Studio Tools/Visual Studio 2010 Command Prompt)
CD в каталог, содержащий соответствующую DLL
Запустите corflags следующим образом:
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
Microsoft .NET 4.5 представила новую опцию Любой 32-разрядный предпочтительный процессор. В новой версии 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 SDK\Windows\v8.1A\bin\NETFX 4.5.1 Инструменты
Version : Assembly 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
для разных сборок.
PresentationCore.dll от GAC_32
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
System.Data.dll от GAC_64
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
System.dll от GAC_MSIL
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
Чтобы узнать больше о любом процессоре 32-бит Предпочитаемые сборки см. Что AnyCPU действительно имеет значение с .NET 4.5 и Visual Studio 11
Вы также можете использовать эту таблицу:
CPU | PE | 32BIT ----------|-------|------ x86 | PE32 | 1 Any CPU | PE32 | 0 x64 | PE32+ | 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. Он будет печатать подписи 1, если сборка либо подписана с задержкой, либо полностью подписана, тогда как бит StrongNameSigned устанавливается, если сборка полностью подписана.