3

重複の可能性:
DLL がマネージ アセンブリかネイティブかを判断する方法 (ネイティブ dll の読み込みを防止する)?
この DLL はマネージですか、それともアンマネージですか?

私のシナリオ: 多数の DLL リソースを C++ から C# マネージ コードに移動するプロセスを開始しています。これらの DLL は共通のディレクトリに存在する必要があり、静的にリンク (参照) されません。代わりに、必要に応じて Assembly.LoadFile() を使用してロードされます。

どれが新しい (マネージ) DLL であるかを判断するために、FileInfo オブジェクトの配列を使用してディレクトリ内のファイルをループし、それぞれについてアセンブリをロードしようとしています。

もちろん、DLL がアンマネージ C++ DLL の 1 つである場合、アセンブリを読み込もうとすると失敗します。

そこで私の質問は、リフレクションなどを使用して DLL ファイルを検査し、マネージド/アンマネージドの性質を判断できるかどうかです。

4

2 に答える 2

1

もちろん、DLL がアンマネージ C++ DLL の 1 つである場合、アセンブリを読み込もうとすると失敗します。

try/catch ブロックを使用してアセンブリのロードを試みる関数を用意し、アセンブリをロードできた場合は true を返し、適切なタイプの例外がスローされた場合は false を返します。

于 2012-08-29T13:34:35.813 に答える
0

GetAssemblyName() を使用して、アセンブリ メタ データのクエリを試行できるようです。呼び出しが失敗すると、BadImageException がスローされます。

class TestAssembly
{
    static void Main()
    {

        try
        {
            System.Reflection.AssemblyName testAssembly =
                System.Reflection.AssemblyName.GetAssemblyName(@"C:\Windows\Microsoft.NET\Framework\v3.5\System.Net.dll");

            System.Console.WriteLine("Yes, the file is an assembly.");
        }

        catch (System.IO.FileNotFoundException)
        {
            System.Console.WriteLine("The file cannot be found.");
        }

        catch (System.BadImageFormatException)
        {
            System.Console.WriteLine("The file is not an assembly.");
        }

        catch (System.IO.FileLoadException)
        {
            System.Console.WriteLine("The assembly has already been loaded.");
        }
    }
}
/* Output (with .NET Framework 3.5 installed):
    Yes, the file is an assembly.
*/

もっと読みたい場合は、 http://msdn.microsoft.com/en-us/library/ms173100.aspxから恥知らずにこれをコピーしました。

于 2012-08-29T13:38:56.410 に答える