.NETのDLLかどうかをアセンブリをロードせずに判別する方法

この記事は公開から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()によりアプリケーションドメインに読み込まれたアセンブリ:
file

参考ウェブサイトなど

Microsoft Docs
方法: ファイルがアセンブリであるかどうかを確認する

Microsoft Docs
方法: リフレクションのみのコンテキストにアセンブリを読み込む

シェアする

  • このエントリーをはてなブックマークに追加

フォローする