AppDomain.AssemblyResolve Olay

Tanım

Bir derlemenin çözümlenmesi başarısız olduğunda gerçekleşir.Occurs when the resolution of an assembly fails.

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

Olay Türü

ResolveEventHandler

Uygulamalar

Öznitelikler

Örnekler

Aşağıdaki örnek, olayını gösterir AssemblyResolve .The following sample demonstrates the AssemblyResolve event.

Bu kod örneğinin çalışması için, tam derleme adını sağlamanız gerekir.For this code example to run, you must provide the fully qualified assembly name. Tam derleme adını alma hakkında daha fazla bilgi için bkz. derleme adları.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

Açıklamalar

ResolveEventHandlerBu olay için, özelliği tarafından belirtilen derlemeyi döndürme ResolveEventArgs.Name veya derleme tanınmıyorsa null değeri döndürme sorumluluğundadır.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. Derlemenin bir yürütme bağlamına yüklenmesi gerekir; yalnızca yansıma bağlamına yüklenirse, bu olayın gerçekleşmesine neden olan Yük başarısız olur.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.

Bu olayın kullanımı hakkında yönergeler için bkz. derleme yüklerini çözümleme.For guidance on the use of this event, see Resolving Assembly Loads.

İle başlayarak .NET Framework 4.NET Framework 4 ResolveEventArgs.RequestingAssembly özelliği, çözülemeyen derleme yükünü isteyen derlemeyi döndürür.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. Örneğin, yükleyici istekte bulunan derlemenin bir bağımlılığını yükleyemeyebilir, çünkü istek yapan derleme ve bağımlılığı yoklama yolunda değil.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. Bir bağımlılığın birden fazla sürümü kullanılabiliyorsa, istenen derlemenin kimliğini bilmek, bağımlılığı bulmak veya doğru sürümü belirlemek için yararlı olabilir.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. Daha fazla bilgi için bkz. ResolveEventArgs.RequestingAssembly.For more information, see ResolveEventArgs.RequestingAssembly.

Önemli

İle başlayarak, .NET Framework 4.NET Framework 4 olay, ResolveEventHandler kaynak derlemeleri dahil tüm derlemeler için oluşturulur.Beginning with the .NET Framework 4.NET Framework 4, the ResolveEventHandler event is raised for all assemblies, including resource assemblies. Önceki sürümlerde olay, kaynak derlemeleri için çıkarılmadı.In earlier versions, the event was not raised for resource assemblies. İşletim sistemi yerelleştirilmiştir, işleyici birden çok kez çağrılabilir: geri dönüş zincirindeki her kültür için bir kez.If the operating system is localized, the handler might be called multiple times: once for each culture in the fallback chain.

Bu olay için, ResolveEventArgs.Name özellik ilke uygulanmadan önce derleme adını döndürür.For this event, the ResolveEventArgs.Name property returns the assembly name before policy is applied.

Önemli

Bu olay için birden fazla olay işleyicisi kayıtlıysa, olay işleyicileri bir olay işleyicisi olmayan bir değer döndürene kadar sırasıyla çağırılır null .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. Sonraki olay işleyicileri yoksayıldı.Subsequent event handlers are ignored.

Olayları işleme hakkında daha fazla bilgi için bkz. olayları işleme veoluşturma.For more information about handling events, see Handling and Raising Events.

Şunlara uygulanır

Ayrıca bkz.