Trabajando con el evento AppDomain.AssemblyResolve

AppDomain.AssemblyResolve utilizar el evento AppDomain.AssemblyResolve para manejar excepciones mientras resuelvo Assemblies de algunos dll cargados en el tiempo de ejecución ( SerializationException para el tipo cargado dinámicamente ).

Cuando se dispara el evento, cargo todas las DLL en mi directorio y creo una matriz de Assembly , luego utilizo este método para obtener la Assembly contiene el tipo que 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 este código solo funciona con AssemblyQualifiedName , y ResolveEventArgs.Name proporcionado por el evento no es tan útil.

¿Me puede sugerir alguna solución?

¿Hay alguna manera de pasar otros argumentos al evento cuando se dispara?

Puede definir un diccionario de ensamblajes desde su directorio, como este:

 private readonly IDictionary additional = new Dictionary(); 

Cargue este diccionario con los ensamblajes de su directorio conocido, como este:

 foreach ( var assemblyName ... corresponding to DLL names in your directory... ) { var assembly = Assembly.Load(assemblyName); additional.Add(assembly.FullName, assembly); } 

Proporcione una implementación para el gancho …

 private Assembly ResolveAssembly(Object sender, ResolveEventArgs e) { Assembly res; additional.TryGetValue(e.Name, out res); return res; } 

… y conectarlo al evento:

 AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += ResolveAssembly; AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly; 

Esto debería funcionar.

Si conoce la lista de ensamblajes que pueden contener tipo que planea deserializar, podría ser mejor simplemente precargar todos los ensamblajes antes de realizar la serialización.

Cuando se desencadena el evento AssemblyResolve no tiene información sobre qué tipo causó la carga, sino solo el nombre del ensamblado. No está claro por qué buscaría ensamblado por algún tipo particular en este caso.

Tenga en cuenta que si 2 ensamblajes tienen la misma identidad (es decir, nombre de archivo en mayúsculas y minúsculas) y uno ya está cargado, el evento no se activará cuando lo espere aunque no se encuentre el tipo en el ensamblado ya cargado.

Enlace al artículo con fines históricos: Resolución de cargas de ensamblaje .