352

.NET アセンブリの任意のリストを取得しました。

各 DLL が (x64 または任意の CPU ではなく) x86 用にビルドされているかどうかをプログラムで確認する必要があります。これは可能ですか?

4

16 に答える 16

330

見るSystem.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)

返された AssemblyName インスタンスからアセンブリ メタデータを調べることができます。

PowerShell の使用:

[36] C:\> [reflection.assemblyname]::GetAssemblyName("${pwd}\Microsoft.GLEE.dll") | フロリダ

名前 : Microsoft.GLEE
バージョン: 1.0.0.0
CultureInfo :
CodeBase : ファイル:///C:/projects/powershell/BuildAnalyzer/...
EscapedCodeBase : ファイル:///C:/projects/powershell/BuildAnalyzer/...
プロセッサアーキテクチャ: MSIL
フラグ: 公開鍵
ハッシュアルゴリズム: SHA1
バージョン互換性: SameMachine
キーペア:
FullName : Microsoft.GLEE、バージョン = 1.0.0.0、カルチャ = ニュート...

ここで、ProcessorArchitectureはターゲット プラットフォームを識別します。

  • Amd64 : x64 アーキテクチャに基づく 64 ビット プロセッサ。
  • Arm : ARM プロセッサ。
  • IA64 : 64 ビット Intel Itanium プロセッサのみ。
  • MSIL : プロセッサおよびワードあたりのビット数に関してニュートラル。
  • X86 : ネイティブまたは 64 ビット プラットフォーム (WOW64) 上の Windows on Windows 環境の 32 ビット Intel プロセッサ。
  • None : プロセッサとワードあたりのビット数の不明または未指定の組み合わせ。

この例では、PowerShell を使用してメソッドを呼び出しています。

于 2008-11-06T22:20:18.830 に答える
234

CorFlags CLIツール (たとえば、C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\CorFlags.exe) を使用して、出力に基づいてアセンブリの状態を判断し、アセンブリをファイルとして開くことができます。バイナリ アセットを使用すると、32BIT フラグが 1 ( x86 ) または 0 (任意の CPUまたはx64に応じてPE)に設定されているかどうかを判断するためにシークする必要がある場所を判断できるはずです。

Option    | PE    | 32BIT
----------|-------|---------
x86       | PE32  | 1
Any CPU   | PE32  | 0
x64       | PE32+ | 0

.NET を使用した x64 開発のブログ投稿には、corflags.

さらに良いことに、アセンブリが値(64 ビット)、(32 ビットおよび WOW)、または(任意の CPU) であるかどうかを他の属性と共に判断するために使用できます。Module.GetPEKindPortableExecutableKindsPE32PlusRequired32BitILOnly

于 2008-11-06T22:19:37.647 に答える
152

明確にするために、CorFlags.exe は.NET Framework SDKの一部です。私のマシンには開発ツールがあり、DLL が 32 ビットのみかどうかを判断する最も簡単な方法は次のとおりです。

  1. Visual Studio コマンド プロンプトを開きます (Windows の場合: [メニュー] [スタート]、[プログラム]、[Microsoft Visual Studio]、[Visual Studio ツール]、[Visual Studio 2008 コマンド プロンプト])。

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

  3. 次のように corflags を実行します。 corflags MyAssembly.dll

次のような出力が得られます。

Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  3.5.21022.8
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 3
ILONLY    : 1
32BIT     : 1
Signed    : 0

コメントによると、上記のフラグは次のように読み取られます。

  • 任意の CPU: PE = PE32 および 32BIT = 0
  • x86: PE = PE32 および 32BIT = 1
  • 64 ビット: PE = PE32+ および 32BIT = 0
于 2009-06-16T17:11:02.630 に答える
23

How about you just write you own? The core of the PE architecture hasn't been seriously changed since its implementation in Windows 95. Here's a C# example:

    public static ushort GetPEArchitecture(string pFilePath)
    {
        ushort architecture = 0;
        try
        {
            using (System.IO.FileStream fStream = new System.IO.FileStream(pFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
            {
                using (System.IO.BinaryReader bReader = new System.IO.BinaryReader(fStream))
                {
                    if (bReader.ReadUInt16() == 23117) //check the MZ signature
                    {
                        fStream.Seek(0x3A, System.IO.SeekOrigin.Current); //seek to e_lfanew.
                        fStream.Seek(bReader.ReadUInt32(), System.IO.SeekOrigin.Begin); //seek to the start of the NT header.
                        if (bReader.ReadUInt32() == 17744) //check the PE\0\0 signature.
                        {
                            fStream.Seek(20, System.IO.SeekOrigin.Current); //seek past the file header,
                            architecture = bReader.ReadUInt16(); //read the magic number of the optional header.
                        }
                    }
                }
            }
        }
        catch (Exception) { /* TODO: Any exception handling you want to do, personally I just take 0 as a sign of failure */}
        //if architecture returns 0, there has been an error.
        return architecture;
    }
}

Now the current constants are:

0x10B - PE32  format.
0x20B - PE32+ format.

But with this method it allows for the possibilities of new constants, just validate the return as you see fit.

于 2012-03-19T09:31:37.677 に答える
9

CodePlexでこのプロジェクトのCorFlagsReaderを使用してみてください。他のアセンブリへの参照はなく、そのまま使用できます。

于 2013-02-18T12:45:49.010 に答える
1

.NETアセンブリのターゲットプラットフォームを確認する別の方法は、 .NETReflectorを使用してアセンブリを検査することです...

@#〜#€〜!新しいバージョンは無料ではないことに気づきました。したがって、修正、無料バージョンの.NETリフレクターがある場合は、それを使用してターゲットプラットフォームを確認できます。

于 2011-08-04T07:56:59.720 に答える
1

ここで見つけることができる、より高度なアプリケーション: CodePlex - ApiChange

例:

C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\winhlp32.exe
File Name; Type; Size; Processor; IL Only; Signed
winhlp32.exe; Unmanaged; 296960; X86

C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\HelpPane.exe
File Name; Type; Size; Processor; IL Only; Signed
HelpPane.exe; Unmanaged; 733696; Amd64
于 2016-10-04T12:12:36.240 に答える
1

cfeduke は、GetPEKind を呼び出す可能性を指摘しています。これを PowerShell から行うのは興味深い可能性があります。

たとえば、使用できるコマンドレットのコードは次のとおりです: https://stackoverflow.com/a/16181743/64257

あるいは、https: //stackoverflow.com/a/4719567/64257 には、 「実行可能イメージのテストに使用できるPowerShell Community Extensionsの Get-PEHeader コマンドレットもあります」と記載されています。

于 2013-04-24T01:19:59.057 に答える