英語で読む

次の方法で共有


AppDomain.AssemblyResolve イベント

定義

アセンブリの解決が失敗したときに発生します。

C#
public event ResolveEventHandler? AssemblyResolve;
C#
public event ResolveEventHandler AssemblyResolve;
C#
[add: System.Security.SecurityCritical]
[remove: System.Security.SecurityCritical]
public event ResolveEventHandler AssemblyResolve;

イベントの種類

実装

属性

次の例では、 イベントを AssemblyResolve 示します。

このコード例を実行するには、完全修飾アセンブリ名を指定する必要があります。 完全修飾アセンブリ名を取得する方法については、「アセンブリ 名」を参照してください。

C#
public class MyType
{
    public MyType()
    {
        Console.WriteLine();
        Console.WriteLine("MyType instantiated!");
    }
}

class AssemblyResolveSnippet
{
    public static void Main()
    {
        AppDomain currentDomain = AppDomain.CurrentDomain;

        // This call will fail to create an instance of MyType since the
        // assembly resolver is not set
        InstantiateMyTypeFail(currentDomain);

        currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

        // This call will succeed in creating an instance of MyType since the
        // assembly resolver is now set.
        InstantiateMyTypeFail(currentDomain);

        // This call will succeed in creating an instance of MyType since the
        // assembly name is valid.
        InstantiateMyTypeSucceed(currentDomain);
    }

    private static void InstantiateMyTypeFail(AppDomain domain)
    {
        // Calling InstantiateMyType will always fail since the assembly info
        // given to CreateInstance is invalid.
        try
        {
            // You must supply a valid fully qualified assembly name here.
            domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyType");
        }
        catch (Exception e)
        {
            Console.WriteLine();
            Console.WriteLine(e.Message);
        }
    }

    private static void InstantiateMyTypeSucceed(AppDomain domain)
    {
        try
        {
            string asmname = Assembly.GetCallingAssembly().FullName;
            domain.CreateInstance(asmname, "MyType");
        }
        catch (Exception e)
        {
            Console.WriteLine();
            Console.WriteLine(e.Message);
        }
    }

    private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
    {
        Console.WriteLine("Resolving...");
        return typeof(MyType).Assembly;
    }
}

注釈

このイベントでは、 ResolveEventHandler プロパティで ResolveEventArgs.Name 指定されたアセンブリを返すか、アセンブリが認識されない場合は null を返す必要があります。 アセンブリを実行コンテキストに読み込む必要があります。リフレクションのみのコンテキストに読み込まれると、このイベントが発生する原因となった読み込みは失敗します。

このイベントの使用に関するガイダンスについては、「 アセンブリの読み込みの解決」を参照してください。

.NET Framework 4 以降では、 ResolveEventArgs.RequestingAssembly プロパティは、解決できなかったアセンブリの読み込みを要求したアセンブリを返します。 たとえば、要求するアセンブリとその依存関係がプローブ パスにないため、ローダーが要求側アセンブリの依存関係を読み込むことができない場合があります。 要求するアセンブリの ID を把握することは、依存関係を見つける場合や、依存関係の複数のバージョンが使用可能な場合は、正しいバージョンを識別する場合に役立つことがあります。 詳細については、「ResolveEventArgs.RequestingAssembly」を参照してください。

重要

.NET Framework 4 以降では、リソース アセンブリをResolveEventHandler含むすべてのアセンブリに対して イベントが発生します。 以前のバージョンでは、リソース アセンブリに対して イベントが発生していなかった。 オペレーティング システムがローカライズされている場合、フォールバック チェーン内のカルチャごとに 1 回、ハンドラーが複数回呼び出されることがあります。

このイベントの場合、 プロパティは ResolveEventArgs.Name 、ポリシーが適用される前にアセンブリ名を返します。

重要

このイベントに複数のイベント ハンドラーが登録されている場合、イベント ハンドラーが ではない null値を返すまで、イベント ハンドラーが順番に呼び出されます。 後続のイベント ハンドラーは無視されます。

イベントの処理の詳細については、「処理とイベントの発生」を参照してください。

適用対象

製品 バージョン
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

こちらもご覧ください