Estoy tratando de usar el evento AppDomain.AssemblyResolve
para manejar excepciones mientras resuelvo los ensamblados de algunos dll cargados en el tiempo de ejecución (SerializationException for dynamically loaded Type).Trabajando con el evento AppDomain.AssemblyResolve
Cuando se dispara el evento, me carga todos los archivos DLL en mi directorio y crear una matriz Assembly
, entonces yo utilizo este método para obtener la Assembly
que contiene el tipo especifico:
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;
}
El problema es que esta el código solo funciona con AssemblyQualifiedName
, y el ResolveEventArgs.Name
proporcionado por el evento no es tan útil.
¿Me puede sugerir alguna solución?
¿Hay alguna manera de transmitir otros argumentos al evento cuando se dispara?
¿La precarga de los ensamblajes evita la necesidad de un manejador de eventos AssemblyResolve? –
@mikez Por lo que yo sé, simplemente cargar un ensamblaje usando 'Assembly.Load (assemblyName)' no lo pone automáticamente a disposición del código de resolución de conjunto de su dominio de aplicación (a menos que ese código pueda acceder al ensamblado usando la resolución predeterminada proceso). Este código se elimina de un sistema en funcionamiento (eliminé el código de manejo de errores, por ejemplo, alrededor de la llamada 'additional.TryGetValue (e.Name, out res)' para simplificar un poco las cosas). Cuando elimino el gancho 'ResolveAssembly', mi sistema de trabajo deja de funcionar :) – dasblinkenlight
Cuando está compilando el diccionario, use AssemblyName.GetAssemblyName () en lugar de Assmebly.Load para obtener el nombre del ensamblado en asignaciones de nombre de archivo y evitar incondicionalmente cargando todos los ensambles. –