AppDomain.AssemblyResolve Ereignis

Definition

Tritt ein, wenn die Auflösung einer Assembly fehlschlägt.Occurs when the resolution of an assembly fails.

public:
 virtual event ResolveEventHandler ^ AssemblyResolve;
[add: System.Security.SecurityCritical]
[remove: System.Security.SecurityCritical]
public event ResolveEventHandler AssemblyResolve;
member this.AssemblyResolve : ResolveEventHandler 
Public Custom Event AssemblyResolve As ResolveEventHandler 

Implementiert

Attribute

Beispiele

Im folgenden Beispiel wird das AssemblyResolve-Ereignis veranschaulicht.The following sample demonstrates the AssemblyResolve event.

Damit dieses Codebeispiel ausgeführt werden kann, müssen Sie den voll qualifizierten Assemblynamen angeben.For this code example to run, you must provide the fully qualified assembly name. Informationen zum Abrufen des voll qualifizierten Assemblynamens finden Sie unter Assemblynamen.For information about how to obtain the fully qualified assembly name, see Assembly Names.

public ref class MyType
{
public:
    MyType()
    {
        Console::WriteLine();
        Console::WriteLine("MyType instantiated!");
    }
};

class Test
{
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 += gcnew ResolveEventHandler(&Test::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);
        }
    }

    static void InstantiateMyTypeSucceed(AppDomain^ domain)
    {
        try
        {
            String^ asmname = Assembly::GetCallingAssembly()->FullName;
            domain->CreateInstance(asmname, "MyType");
        }
        catch (Exception^ e)
        {
            Console::WriteLine();
            Console::WriteLine(e->Message);
        }
    }

    static Assembly^ MyResolveEventHandler(Object^ sender, ResolveEventArgs^ args)
    {
        Console::WriteLine("Resolving...");
        return MyType::typeid->Assembly;
    }
};

int main()
{
    Test::Main();
}
public class MyType
{
    public MyType()
    {
        Console.WriteLine();
        Console.WriteLine("MyType instantiated!");
    }
}

class Test
{
    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;
    }
}
Public Class MyType

    Public Sub New()
        Console.WriteLine()
        Console.WriteLine("MyType instantiated!")
    End Sub

End Class

Class Test

    Public Shared Sub Main()
        Dim currentDomain As AppDomain = AppDomain.CurrentDomain

        ' This call will fail to create an instance of MyType since the
        ' assembly resolver is not set
        InstantiateMyTypeFail(currentDomain)

        AddHandler currentDomain.AssemblyResolve, AddressOf 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)
    End Sub

    Private Shared Sub InstantiateMyTypeFail(domain As AppDomain)
        ' 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 e As Exception
            Console.WriteLine()
            Console.WriteLine(e.Message)
        End Try
    End Sub

    Private Shared Sub InstantiateMyTypeSucceed(domain As AppDomain)
        Try
            Dim asmname As String = Assembly.GetCallingAssembly().FullName
            domain.CreateInstance(asmname, "MyType")
        Catch e As Exception
            Console.WriteLine()
            Console.WriteLine(e.Message)
        End Try
    End Sub

    Private Shared Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As Assembly
        Console.WriteLine("Resolving...")
        Return GetType(MyType).Assembly
    End Function 'MyResolveEventHandler

End Class

Hinweise

Es liegt in der Verantwortung des ResolveEventHandler für dieses Ereignis, die Assembly zurückzugeben, die von der ResolveEventArgs.Name-Eigenschaft angegeben wird, oder NULL zurückzugeben, wenn die Assembly nicht erkannt wird.It is the responsibility of the ResolveEventHandler for this event to return the assembly that is specified by the ResolveEventArgs.Name property, or to return null if the assembly is not recognized. Die Assembly muss in einen Ausführungs Kontext geladen werden. Wenn Sie in den reflektionsbasierten Kontext geladen wird, schlägt die Auslastung fehl, die das Ereignis ausgelöst hat.The assembly must be loaded into an execution context; if it is loaded into the reflection-only context, the load that caused this event to be raised fails.

Hinweise zur Verwendung dieses Ereignisses finden Sie unter Auflösen von assemblyladungen.For guidance on the use of this event, see Resolving Assembly Loads.

Beginnend mit dem .NET Framework 4.NET Framework 4gibt die ResolveEventArgs.RequestingAssembly-Eigenschaft die Assembly zurück, die das Laden der Assembly angefordert hat, die nicht aufgelöst werden konnte.Beginning with the .NET Framework 4.NET Framework 4, the ResolveEventArgs.RequestingAssembly property returns the assembly that requested the assembly load that could not be resolved. Das Lade Modul kann z. b. möglicherweise keine Abhängigkeit der anfordernden Assembly laden, da sich die anfordernde Assembly und ihre Abhängigkeit nicht im probingpfad befinden.For example, the loader might be unable to load a dependency of the requesting assembly because the requesting assembly and its dependency are not in the probing path. Wenn Sie die Identität der anfordernden Assembly kennen, kann es hilfreich sein, die Abhängigkeit zu suchen oder die richtige Version zu identifizieren, wenn mehr als eine Version der Abhängigkeit verfügbar ist.Knowing the identity of the requesting assembly might be useful in locating the dependency or in identifying the correct version, if more than one version of the dependency is available. Weitere Informationen finden Sie unter ResolveEventArgs.RequestingAssembly.For more information, see ResolveEventArgs.RequestingAssembly.

Wichtig

Beginnend mit dem .NET Framework 4.NET Framework 4wird das ResolveEventHandler-Ereignis für alle Assemblys, einschließlich Ressourcenassemblys, ausgelöst.Beginning with the .NET Framework 4.NET Framework 4, the ResolveEventHandler event is raised for all assemblies, including resource assemblies. In früheren Versionen wurde das Ereignis nicht für Ressourcenassemblys ausgelöst.In earlier versions, the event was not raised for resource assemblies. Wenn das Betriebssystem lokalisiert ist, wird der Handler möglicherweise mehrmals aufgerufen: einmal für jede Kultur in der Fall Back Kette.If the operating system is localized, the handler might be called multiple times: once for each culture in the fallback chain.

Bei diesem Ereignis gibt die ResolveEventArgs.Name-Eigenschaft den Assemblynamen zurück, bevor die Richtlinie angewendet wird.For this event, the ResolveEventArgs.Name property returns the assembly name before policy is applied.

Wichtig

Wenn mehr als ein Ereignishandler für dieses Ereignis registriert ist, werden die Ereignishandler in der entsprechenden Reihenfolge aufgerufen, bis ein Ereignishandler einen Wert zurückgibt, der nicht null ist.If more than one event handler is registered for this event, the event handlers are called in order until an event handler returns a value that isn't null. Nachfolgende Ereignishandler werden ignoriert.Subsequent event handlers are ignored.

Weitere Informationen zur Behandlung von Ereignissen finden Sie unter behandeln und Auslösen von Ereignissen.For more information about handling events, see Handling and Raising Events.

Sicherheit

SecurityCriticalAttribute
Erfordert volle Vertrauenswürdigkeit für den unmittelbaren Aufrufer.Requires full trust for the immediate caller. Dieser Member kann nicht von teilweise vertrauenswürdigem oder transparentem Code verwendet werden.This member cannot be used by partially trusted or transparent code.

Gilt für:

Siehe auch