.NET アセンブリの任意のリストを取得しました。
各 DLL が (x64 または任意の CPU ではなく) x86 用にビルドされているかどうかをプログラムで確認する必要があります。これは可能ですか?
.NET アセンブリの任意のリストを取得しました。
各 DLL が (x64 または任意の CPU ではなく) x86 用にビルドされているかどうかをプログラムで確認する必要があります。これは可能ですか?
見る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はターゲット プラットフォームを識別します。
この例では、PowerShell を使用してメソッドを呼び出しています。
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.GetPEKind
PortableExecutableKinds
PE32Plus
Required32Bit
ILOnly
明確にするために、CorFlags.exe は.NET Framework SDKの一部です。私のマシンには開発ツールがあり、DLL が 32 ビットのみかどうかを判断する最も簡単な方法は次のとおりです。
Visual Studio コマンド プロンプトを開きます (Windows の場合: [メニュー] [スタート]、[プログラム]、[Microsoft Visual Studio]、[Visual Studio ツール]、[Visual Studio 2008 コマンド プロンプト])。
問題のDLLを含むディレクトリへのCD
次のように 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
コメントによると、上記のフラグは次のように読み取られます。
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.
CodePlexでこのプロジェクトのCorFlagsReaderを使用してみてください。他のアセンブリへの参照はなく、そのまま使用できます。
.NETアセンブリのターゲットプラットフォームを確認する別の方法は、 .NETReflectorを使用してアセンブリを検査することです...
@#〜#€〜!新しいバージョンは無料ではないことに気づきました。したがって、修正、無料バージョンの.NETリフレクターがある場合は、それを使用してターゲットプラットフォームを確認できます。
ここで見つけることができる、より高度なアプリケーション: 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
cfeduke は、GetPEKind を呼び出す可能性を指摘しています。これを PowerShell から行うのは興味深い可能性があります。
たとえば、使用できるコマンドレットのコードは次のとおりです: https://stackoverflow.com/a/16181743/64257
あるいは、https: //stackoverflow.com/a/4719567/64257 には、 「実行可能イメージのテストに使用できるPowerShell Community Extensionsの Get-PEHeader コマンドレットもあります」と記載されています。