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属性返回请求无法解析的程序集加载的程序集。 例如,加载程序可能无法加载请求程序集的依赖项,因为请求程序集及其依赖项不在探测路径中。 如果有多个版本的依赖项可用,则了解请求程序集的标识对于查找依赖项或识别正确版本可能很有用。 有关详细信息,请参阅 ResolveEventArgs.RequestingAssembly

重要

从 .NET Framework 4 开始,ResolveEventHandler为所有程序集(包括资源程序集)引发 事件。 在早期版本中,不会为资源程序集引发 事件。 如果操作系统已本地化,可能会多次调用处理程序:针对回退链中的每个区域性调用一次。

对于此事件, 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

另请参阅