Auf Englisch lesen

Teilen über


AppDomain.TypeResolve Ereignis

Definition

Tritt ein, wenn die Auflösung eines Typs fehlschlägt.

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

Ereignistyp

Implementiert

Attribute

Beispiele

Das folgende Beispiel veranschaulicht das TypeResolve Ereignis.

Damit dieses Codebeispiel ausgeführt werden kann, müssen Sie den vollqualifizierten Assemblynamen angeben. Informationen zum Abrufen des vollqualifizierten Assemblynamens finden Sie unter Assemblynamen.

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".
 */

Hinweise

Das TypeResolve Ereignis tritt auf, wenn die Common Language Runtime die Assembly nicht ermitteln kann, die den angeforderten Typ erstellen kann. Dies kann auftreten, wenn der Typ in einer dynamischen Assembly definiert ist oder der Typ nicht in einer dynamischen Assembly definiert ist, die Laufzeit jedoch nicht weiß, in welcher Assembly der Typ definiert ist. Letztere Situation kann auftreten, wenn Type.GetType mit einem Typnamen aufgerufen wird, der nicht mit dem Assemblynamen qualifiziert ist.

Der ResolveEventHandler für dieses Ereignis kann versuchen, den Typ zu suchen und zu erstellen.

Das Ereignis tritt jedoch nicht auf, wenn die Runtime weiß, TypeResolve dass es nicht möglich ist, einen Typ in bestimmten Assemblys zu finden. Dieses Ereignis tritt beispielsweise nicht auf, wenn der Typ nicht in einer statischen Assembly gefunden wird, da die Runtime weiß, dass Typen nicht dynamisch zu statischen Assemblys hinzugefügt werden können.

Ab dem .NET Framework 4 enthält die -Eigenschaft die ResolveEventArgs.RequestingAssembly Assembly, die den Typ angefordert hat. Weitere Informationen finden Sie unter ResolveEventArgs.RequestingAssembly.

Um einen Ereignishandler für dieses Ereignis zu registrieren, müssen Sie über die erforderlichen Berechtigungen verfügen, oder ein SecurityException wird ausgelöst.

Weitere Informationen zur Behandlung von Ereignissen finden Sie unter behandeln und Auslösen von Ereignissen.

Gilt für:

Produkt Versionen
.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

Weitere Informationen