Как интерпретировать флаги CorFlags?

Как интерпретировать флаги CorFlags и как использовать их, чтобы определить, была ли сборка.NET построена для x86 или x64?

Может ли это быть следующим?

corflags MyAssembly.dll

4 ответа

Решение

Откройте командную строку Visual Studio (в Windows: меню Пуск / Программы / Microsoft Visual
Studio / Инструменты Visual Studio / Командная строка Visual Studio 2010)

Компакт-диск в каталог, содержащий 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 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 для разных сборок.

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-разрядных сборках Любого ЦП, ознакомьтесь с тем, что на самом деле означает Any CPU, начиная с.NET 4.5 и Visual Studio 11.

Чтобы добавить больше деталей к другим ответам, фактическим важным значением является шестнадцатеричное значение 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 устанавливается, если сборка полностью подписана.

Вы также можете использовать эту таблицу:

     Процессор | ЧП | 32BIT
  ----------|-------|------
  х86       | PE32  |  1   
  Любой процессор | PE32  |  0   
  х64       | PE32+ |  0   
Другие вопросы по тегам