AppDomain.AssemblyResolve Gebeurtenis
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Treedt op wanneer de resolutie van een assembly mislukt.
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
Gebeurtenistype
Implementeringen
- Kenmerken
Voorbeelden
In het volgende voorbeeld ziet u de AssemblyResolve gebeurtenis.
Als u dit codevoorbeeld wilt uitvoeren, moet u de volledig gekwalificeerde assemblynaam opgeven. Zie Assemblynamen voor informatie over het verkrijgen van de volledig gekwalificeerde assemblynaam.
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 AssemblyResolveSnippet
{
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;
}
}
type MyType() =
do
printfn "\nMyType instantiated!"
let instantiateMyTypeFail (domain: 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")
|> ignore
with e ->
printfn $"\n{e.Message}"
let instantiateMyTypeSucceed (domain: AppDomain) =
try
let asmname = Assembly.GetCallingAssembly().FullName
domain.CreateInstance(asmname, "MyType")
|> ignore
with e ->
printfn $"\n{e.Message}"
let myResolveEventHandler _ _ =
printfn "Resolving..."
typeof<MyType>.Assembly
let currentDomain = AppDomain.CurrentDomain
// This call will fail to create an instance of MyType since the
// assembly resolver is not set
instantiateMyTypeFail currentDomain
currentDomain.add_AssemblyResolve (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
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
Opmerkingen
Het is de verantwoordelijkheid van de ResolveEventHandler gebeurtenis om de assembly te retourneren die is opgegeven door de ResolveEventArgs.Name eigenschap of om null te retourneren als de assembly niet wordt herkend. De assembly moet in een uitvoeringscontext worden geladen; als deze wordt geladen in de context met alleen weerspiegeling, mislukt de belasting waardoor deze gebeurtenis is gegenereerd.
Zie Assemblybelastingen oplossen voor hulp bij het gebruik van deze gebeurtenis.
Vanaf het .NET Framework 4 retourneert de eigenschap ResolveEventArgs.RequestingAssembly de assembly die de assemblybelasting heeft aangevraagd die niet kon worden opgelost. Het laadprogramma kan bijvoorbeeld geen afhankelijkheid van de aanvraagassembly laden omdat de aanvraagassembly en de afhankelijkheid ervan zich niet in het proefpad bevinden. Als u de identiteit van de aanvraagassembly kent, kan dit handig zijn bij het vinden van de afhankelijkheid of bij het identificeren van de juiste versie, als er meer dan één versie van de afhankelijkheid beschikbaar is. Zie ResolveEventArgs.RequestingAssembly voor meer informatie.
Important
Vanaf het .NET Framework 4 wordt de gebeurtenis ResolveEventHandler gegenereerd voor alle assembly's, inclusief resourceassembly's. In eerdere versies is de gebeurtenis niet gegenereerd voor resourceassembly's. Als het besturingssysteem is gelokaliseerd, kan de handler meerdere keren worden aangeroepen: één keer voor elke cultuur in de terugvalketen.
Voor deze gebeurtenis retourneert de ResolveEventArgs.Name eigenschap de assemblynaam voordat beleid wordt toegepast.
Important
Als meer dan één gebeurtenis-handler is geregistreerd voor deze gebeurtenis, worden de gebeurtenis-handlers op volgorde aangeroepen totdat een gebeurtenis-handler een waarde retourneert die niet nullis. Volgende gebeurtenis-handlers worden genegeerd.
Zie Gebeurtenissen verwerken en genereren voor meer informatie over het afhandelen van gebeurtenissen.