.NETアセンブリがx86またはx64用に構築されているかどうかを判断する方法


Answers

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

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

ブログ投稿x64 .NETでの開発には、 corflagsに関する情報がいくつかあります。

さらに、 Module.GetPEKind使用して 、アセンブリがPortableExecutableKindsPE32Plus (64ビット)、 Required32Bit (32ビットおよびWOW)、またはILOnly (すべてのCPU)であるかILOnlyかを他の属性でILOnlyできます。

Question

私は.NETアセンブリの任意のリストを持っています。

私は、各DLLが(x64または任意のCPUとは対照的に)x86用に構築されているかどうかをプログラムでチェックする必要があります。 これは可能ですか?




cfedukeはGetPEKindを呼び出す可能性を示します。 これをPowerShellから行うのは面白いことです。

ここでは、たとえば、使用できるコマンドレットのコードを示しhttps://.com/a/16181743/64257 : https://.com/a/16181743/64257

代わりに、 https://.com/a/4719567/64257 //.com/a/4719567/64257には、「実行可能イメージをテストするために使用できるPowerShellコミュニティ拡張機能に Get-PEHeaderコマンドレットもありhttps://.com/a/4719567/64257 」と記載されています。




JetBriansのDotPeekは、msil(anycpu)、x86、x64をすばやく簡単に表示する方法を提供します




[TestMethod]
public void EnsureKWLLibrariesAreAll64Bit()
{
    var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Where(x => x.FullName.StartsWith("YourCommonProjectName")).ToArray();
    foreach (var assembly in assemblies)
    {
        var myAssemblyName = AssemblyName.GetAssemblyName(assembly.FullName.Split(',')[0] + ".dll");
        Assert.AreEqual(ProcessorArchitecture.MSIL, myAssemblyName.ProcessorArchitecture);
    }
}



あなたはあなた自身のことを書いてどうですか? PEアーキテクチャのコアは、Windows 95で実装されて以来、大きく変更されていません。ここにC#の例があります。

    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;
    }
}

現在の定数は次のとおりです。

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

しかし、この方法では、新しい定数の可能性を考慮して、適切と思われるようにリターンを検証します。




もう1つの方法は、DLLのVisual Studioツールからdumpbinを使用して、適切な出力を探し出すことです

dumpbin.exe /HEADERS <your dll path>
    FILE HEADER VALUE
                 14C machine (x86)
                   4 number of sections
            5885AC36 time date stamp Mon Jan 23 12:39:42 2017
                   0 file pointer to symbol table
                   0 number of symbols
                  E0 size of optional header
                2102 characteristics
                       Executable
                       32 bit word machine
                       DLL

注:上記のo / pは32ビットdll用です

dumpbin.exeのもう1つの便利なオプションは/ EXPORTSです。これはdllによって公開されている関数を表示します

dumpbin.exe /EXPORTS <PATH OF THE DLL>