Próbuję użyć zdarzenia AppDomain.AssemblyResolve
do obsługi wyjątków podczas rozwiązywania Złożenia niektórych bibliotek dll załadowanych w środowisku wykonawczym (SerializationException for dynamically loaded Type).Praca z zdarzeniem AppDomain.AssemblyResolve
Kiedy zdarzenie jest zwolniony, załadować wszystkie pliki DLL w moim katalogu i utworzyć Assembly
tablicę, a następnie użyć tej metody, aby uzyskać Assembly
zawierający typ określić:
public static Assembly GetAssemblyContainingType(String completeTypeName, Assembly[] assemblies)
{
Assembly assembly = null;
foreach (Assembly currentassembly in assemblies)
{
Type t = currentassembly.GetType(completeTypeName, false, true);
if (t != null)
{
assembly = currentassembly;
break;
}
}
return assembly;
}
Problemem jest to, że Kod działa tylko z AssemblyQualifiedName
, a ResolveEventArgs.Name
dostarczone przez zdarzenie nie jest tak przydatne.
Czy możesz zaproponować mi obejście problemu?
Czy istnieje sposób przekazania innym argumentów do zdarzenia po jego uruchomieniu?
Czy wstępne ładowanie złożeń nie eliminuje potrzeby obsługi zdarzeń AssemblyResolve? –
@mikez Z tego co wiem, proste ładowanie złożenia za pomocą 'Assembly.Load (assemblyName)' nie powoduje automatycznego udostępnienia go do kodu rozdzielczości zespołu domeny aplikacji (chyba że ten kod może uzyskać dostęp do złożenia przy użyciu domyślnej rozdzielczości proces). Ten kod został usunięty z działającego systemu (usunąłem kod obsługi błędów, np. Wokół wywołania 'additional.TryGetValue (e.Name, out res)' w celu uproszczenia niektórych rzeczy). Po usunięciu haka 'ResolveAssembly' mój system operacyjny przestaje działać :) – dasblinkenlight
Podczas budowania słownika użyj AssemblyName.GetAssemblyName () zamiast Assmebly.Load, aby uzyskać nazwę zespołu na mapowanie nazw plików i unikaj bezwarunkowo ładowanie wszystkich zespołów. –