.net - Comportamiento extraño al mezclar carga de ensamblajes usando Assembly.LoadFrom y Assembly.Load
assemblies (2)
@Kent Boogart: Esa parece ser la explicación correcta. Para una explicación completa, Suzanne Cook tiene esta publicación de blog que elabora un poco más que la original que publicaste: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
Lo siguiente es el aprovechamiento de código AppDomain.AssemblyResolve -
// register to listen to all assembly resolving attempts:
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
// Check whether the desired assembly is already loaded
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies) {
AssemblyName assemblyName = assembly.GetName();
string desiredAssmebly = args.Name;
if (assemblyName.FullName == desiredAssmebly) {
return assembly;
}
}
// Failed to find the desired assembly
return null;
}
Comportamiento extraño al mezclar carga de ensamblajes usando Assembly.LoadFrom y Assembly.Load
He encontrado un comportamiento extraño al cargar ensamblajes con Assembly.LoadFrom y más tarde con Assembly.Load.
Estoy cargando un ensamblaje usando Assembly.LoadFrom, donde el ensamblaje está ubicado en una carpeta que no es la carpeta de ejecución.
Más adelante en mi código de prueba cuando intento cargar nuevamente este ensamblado con Assembly.Load, la carga falla con System.IO.FileNotFoundException ("No se pudo cargar el archivo o el ensamblaje ...") a pesar de que el ensamblaje ya está cargado . La carga falla tanto con el nombre fuerte como con el nombre no fuerte (la razón original para cargar una vez más este ensamblaje es un uso de un BinaryFormatter).
Sin embargo, en el caso de que el ensamblado esté ubicado en la carpeta de ejecución, la carga posterior tendrá éxito en ambos casos, con el nombre fuerte y el nombre no fuerte. En este caso, puede ver que dos conjuntos idénticos se cargan desde dos ubicaciones diferentes.
Una muestra de código simple que recrea este problema -
Assembly assembly1 = Assembly.LoadFrom (@ "C: / a.dll");
// Cargando con un nombre seguro falla Assembly assembly2 = Assembly.Load (@ "a, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 14986c3f172d1c2c");
// También se carga con una falla no fuerte Assembly assembly3 = Assembly.Load (@ "a");
- ¿Alguna explicación de por qué el CLR ignora el ensamblaje ya cargado?
- ¿Alguna idea de cómo puedo aliviar este problema?
Gracias.
Eso no es raro De acuerdo con la documentación, la carga con Load y LoadFrom colocará los ensamblajes en diferentes contextos. Esto podría ayudar.
- ¿Alguna explicación de por qué el CLR ignora el ensamblaje ya cargado?
Porque están en un contexto diferente.
- ¿Alguna idea de cómo puedo aliviar este problema?
Cargue desde el mismo contexto o ayude al CLR a encontrar el ensamblado, tal vez adjuntando un controlador a AppDomain.AssemblyResolve
.
Alternativa
Si la ubicación desde la que está cargando los ensamblados es una subcarpeta en AppDomain.BaseDirectory, simplemente puede agregar una entrada a su App.config:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2/subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>