Прочитать на английском

Поделиться через


AppDomain.AssemblyResolve Событие

Определение

Происходит, когда разрешение сборки завершается неудачей.

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

Тип события

Реализации

Атрибуты

Примеры

В следующем примере показано AssemblyResolve событие .

Для выполнения этого примера кода необходимо указать полное имя сборки. Сведения о том, как получить полное имя сборки, см. в разделе Имена сборок.

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

См. также раздел