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

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


AppDomain.TypeResolve Событие

Определение

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

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

Тип события

Реализации

Атрибуты

Примеры

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

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

C#
using System;
using System.Reflection;
using System.Reflection.Emit;

class Test
{
    // For this code example, the following information needs to be
    // available to both Main and the HandleTypeResolve event
    // handler:
    private static AssemblyBuilder ab;
    private static string moduleName;

    public static void Main()
    {
        AppDomain currDom = AppDomain.CurrentDomain;

        // Create a dynamic assembly with one module, to be saved to
        // disk (AssemblyBuilderAccess.Save).
        //
        AssemblyName aName = new AssemblyName();
        aName.Name = "Transient";
        moduleName = aName.Name + ".dll";
        ab = currDom.DefineDynamicAssembly(aName,
            AssemblyBuilderAccess.Save);
        ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, moduleName);

        // The dynamic assembly has just one dummy type, to demonstrate
        // type resolution.
        TypeBuilder tb = mb.DefineType("Example");
        tb.CreateType();

        // First, try to load the type without saving the dynamic
        // assembly and without hooking up the TypeResolve event. The
        // type cannot be loaded.
        try
        {
            Type temp = Type.GetType("Example", true);
            Console.WriteLine("Loaded type {0}.", temp);
        }
        catch (TypeLoadException)
        {
            Console.WriteLine("Loader could not resolve the type.");
        }

        // Hook up the TypeResolve event.
        //
        currDom.TypeResolve +=
            new ResolveEventHandler(HandleTypeResolve);

        // Now try to load the type again. The TypeResolve event is
        // raised, the dynamic assembly is saved, and the dummy type is
        // loaded successfully. Display it to the console, and create
        // an instance.
        Type t = Type.GetType("Example", true);
        Console.WriteLine("Loaded type \"{0}\".", t);
        Object o = Activator.CreateInstance(t);
    }

    static Assembly HandleTypeResolve(object sender, ResolveEventArgs args)
    {
        Console.WriteLine("TypeResolve event handler.");

        // Save the dynamic assembly, and then load it using its
        // display name. Return the loaded assembly.
        //
        ab.Save(moduleName);
        return Assembly.Load(ab.FullName);
    }
}

/* This code example produces the following output:

Loader could not resolve the type.
TypeResolve event handler.
Loaded type "Example".
 */

Комментарии

Это TypeResolve событие возникает, когда общеязыковой среде выполнения не удается определить сборку, которая может создать запрошенный тип. Это может произойти, если тип определен в динамической сборке или тип не определен в динамической сборке, но среда выполнения не знает, в какой сборке определен тип. Последняя ситуация может возникнуть, когда Type.GetType вызывается с именем типа, которое не соответствует имени сборки.

Для ResolveEventHandler этого события может попытаться найти и создать тип .

Однако событие не возникает, TypeResolve если среда выполнения знает, что невозможно найти тип в определенных сборках. Например, это событие не возникает, если тип не найден в статической сборке, так как среда выполнения знает, что типы не могут быть динамически добавлены в статические сборки.

Начиная с платформа .NET Framework 4, свойство содержит сборку, ResolveEventArgs.RequestingAssembly запрашивающую тип . Для получения дополнительной информации см. ResolveEventArgs.RequestingAssembly.

Чтобы зарегистрировать обработчик событий для этого события, необходимо иметь необходимые разрешения, иначе SecurityException создается исключение .

Дополнительные сведения об обработке событий см. в разделе Обработка и вызов событий.

Применяется к

Продукт Версии
.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

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