web-dev-qa-db-ja.com

CorFlagsフラグの解釈方法は?

CorFlags フラグをどのように解釈し、.NETアセンブリがx86またはx64向けにビルドされたかを判断するためにどのように使用する必要がありますか?

それは次のことですか?

corflags MyAssembly.dll
51
user2745934

Visual Studioコマンドプロンプトを開きます(Windowsの場合:スタート/プログラム/ Microsoft Visualメニュー
Studio/Visual Studio Tools/Visual Studio 2010コマンドプロンプト)

問題のDLLを含むディレクトリへのCD

次のような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
26
Cornel Marian

Microsoft。NET 4.5は新しいオプションを導入しました任意のCPU 32ビット優先。 CorFlags.exeの新しいバージョンでは、32BITフラグは存在しなくなり、代わりに2つの新しいフラグ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ツール

_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
_

System.Data.dll fromGAC_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 fromGAC_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
_

Any CPU 32-bit Preferredアセンブリの詳細については、 。NET 4.5およびVisual Studio 11のAnyCPUの実際の意味 を参照してください。

82
Ashish Singh

他の回答に詳細を追加するために、実際の重要な値は16進数のCorFlags値です。これは、ほとんどの情報を伝達するためです。これを構成するビットのリストは次のとおりです。

[Flags]
public enum CorFlags
{
    ILOnly           = 0x00000001,
    Requires32Bit    = 0x00000002,
    ILLibrary        = 0x00000004,
    StrongNameSigned = 0x00000008,
    NativeEntryPoint = 0x00000010,
    TrackDebugData   = 0x00010000,
    Prefers32Bit     = 0x00020000,
}

Corflagsは、この値の4ビットを個別に出力します(ILONLY、32BITREQ、32BITPREF、およびSigned)。ただし、CorFlagsの完全な値には、ILLibrary、NativeEntryPoint、TrackDebugDataビットだけでなく、アセンブリが厳密な名前で署名されているか、遅延で署名されているか(0x8ビット)に関する情報も含まれます(これらの意味はわかりません)。

CorFlagsの出力Signedは、厳密にはStrongNameSignedビットではないことに注意してください。アセンブリが遅延署名されているか完全に署名されている場合はSigned 1を出力しますが、アセンブリが完全に署名されている場合のみStrongNameSignedビットが設定されます。

9
Kirill Osenkov

次の表も使用できます。

 CPU | PE | 32BIT 
 ---------- | ------- | ------ 
 x86 | PE32 | 1 
任意のCPU | PE32 | 0 
 x64 | PE32 + | 0 
7
user2069105