この記事は公開から4年以上経過しています。
アプリケーションドメインにアセンブリをロードせずにDLLが.NETアセンブリかどうかを確認する方法。
サンプルソースコード(C#)
アセンブリ名が取得できるかどうかで、アセンブリかどうかを判定します。
using System;
namespace CheckDLLTest
{
internal class Program
{
private static void Main(string[] args)
{
// .NET
Console.WriteLine(IsDotNetAssembly("DotNetLibrary.dll") ? ".NET DLL" : "Non .NET DLL");
// Native
Console.WriteLine(IsDotNetAssembly("NativeLibrary.dll") ? ".NET DLL" : "Non .NET DLL");
}
private static bool IsDotNetAssembly(string dllPath)
{
try
{
// .NETアセンブリ出ない場合は`BadImageFormatException`がスローされる
System.Reflection.AssemblyName.GetAssemblyName(dllPath);
return true;
}
catch
{
return false;
}
}
}
}
実行結果
.NET DLL
Non .NET DLL
プラグインDLLなどの判定目的の場合にはリフレクションのみの読み込みコンテキストAssembly.ReflectionOnlyLoadFrom()
を使いプラグインインターフェースを実装しているかどうかを併せて確認してしまうことも可能ですが、チェック対象のDLLがアセンブリの場合はアプリケーションドメインに読み込まれてしまうことに留意する必要があります(アンロードしたい場合は、アプリケーションドメインのアンロードが必要)。
Assembly.ReflectionOnlyLoadFrom()によりアプリケーションドメインに読み込まれたアセンブリ:
参考ウェブサイトなど
Microsoft Docs
方法: ファイルがアセンブリであるかどうかを確認する
Microsoft Docs
方法: リフレクションのみのコンテキストにアセンブリを読み込む