AppDomain.TypeResolve Událost

Definice

Vyvolá se při selhání překladu typu.

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

Event Type

Implementuje

Atributy

Příklady

Následující ukázka ukazuje TypeResolve událost.

Pro spuštění této ukázky kódu je nutné zadat plně kvalifikovaný název. Informace o tom, jak získat plně kvalifikovaný název sestavení naleznete v části Názvy sestavení.

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

Poznámky

Událost TypeResolve nastane, když modul CLR (Common Language Runtime) nedokáže určit sestavení, které může vytvořit požadovaný typ. K tomu může dojít, pokud je typ definován v dynamickém sestavení nebo není definován v dynamickém sestavení, ale modul runtime neví, ve kterém sestavení je typ definován. Druhá situace může nastat, pokud Type.GetType je volána s názvem typu, který není kvalifikovaný s názvem sestavení.

Pro ResolveEventHandler tuto událost se může pokusit najít a vytvořit typ.

Událost však nedochází, pokud modul runtime ví, TypeResolve že není možné najít typ v určitých sestaveních. Například k této události nedojde, pokud typ není nalezen ve statickém sestavení, protože modul runtime zná typy nelze dynamicky přidat do statických sestavení.

Počínaje rozhraním .NET Framework 4 ResolveEventArgs.RequestingAssembly obsahuje vlastnost sestavení, které požadovalo typ. Další informace naleznete v tématu ResolveEventArgs.RequestingAssembly.

Chcete-li zaregistrovat obslužnou rutinu události pro tuto událost, musíte mít požadovaná oprávnění nebo SecurityException je vyvolán.

Další informace o zpracování událostí najdete v tématu Zpracování a vyvolávání událostí.

Platí pro

Produkt Verze
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.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

Viz také