プログラムでdllをc#にロードしてプロセッサアーキテクチャを取得できますか?
これができるクラスはありますか?
dllがx86、x64、MSILなどであるかどうかを確認する必要があります。
プログラムでdllをc#にロードしてプロセッサアーキテクチャを取得できますか?
これができるクラスはありますか?
dllがx86、x64、MSILなどであるかどうかを確認する必要があります。
.net アセンブリのみを見ていると仮定すると、画像のヘッダーを見る ためにCorFlags.exeを使用できます。
このブログ投稿では、結果の読み取り方法を決定するための使用法について説明しています。抜粋:
使用法: Corflags.exe アセンブリ [オプション]
オプションが指定されていない場合、指定されたイメージのフラグが表示されます。
...
ヘッダーの各コンポーネントの意味は次のとおりです。
Version : バイナリのビルドに使用された .NET Redist のバージョンが含まれます。
CLR ヘッダー: 2.0 は .Net 1.0 または .Net 1.1 (Everett) イメージを示し、2.5 は .Net 2.0 (Whidbey) イメージを示します。
CorFlags:これは、イメージが ILONLY かどうか、そのビット数などを示す特定のフラグの OR によって計算され、ローダーによって使用されます。ILONLY: マネージド イメージにはネイティブ コードを含めることができます。「anycpu」であるためには、イメージに IL のみが含まれている必要があります。
32BIT: IL のみを含むイメージがある場合でも、プラットフォームに依存する可能性があります。32BIT フラグは、「x86」イメージと「anycpu」イメージを区別するために使用されます。64 ビット イメージは、PE タイプが PE32+ であるという事実によって区別されます。
最も興味深い側面は、ヘッダーの PE と 32BIT フラグです。これらを組み合わせて、アセンブリ タイプを指定します。これらは次のようになります。
- anycpu: PE = PE32 および 32BIT = 0
- x86: PE = PE32 および 32BIT = 1
- 64 ビット: PE = PE32+ および 32BIT = 0
アセンブリをロードして見つけようとするのは、ニワトリが先か卵が先かという命題です。BadImageFormatException を取得しない場合、アーキテクチャは適切であり、それが何であるかはもはや気にしません。例外が発生する場合は、プログラムの構成が間違っています。コードでそれについてできることは何もありません。
FileStream を使用してアセンブリ ファイルを読み取ることもできます。Windows 実行可能ファイルの形式は、Microsoft pe/coff 仕様で指定されています。ここで読むことができます:
http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx