2011-04-15 14 views
5

Así que aquí está la situación:Cambio de nombre de archivo de ensamblado y Assembly.LoadFile

Tengo un ensamblado llamado Lib1.dll. Por alguna razón (no relevante para la pregunta) tuve que cambiar el nombre del archivo de ensamblado a Lib1New.dll, ahora al intentar cargar el ensamblado renombrado usando Assembly.LoadFile noté que el CLR también intenta cargar el Lib1.dll.

Si Lib1.dll se encuentra en la ruta de búsqueda, se carga en el espacio de direcciones. La aplicación funciona bien independientemente de si se encontró Lib1.dll o no. (El problema es que si se encuentra Lib1.dll, el archivo se bloquea y no puede ser eliminado por otros procesos).

enter image description here

No entiendo por qué las búsquedas loadFile y cargas Lib1.dll. Se supone que LoadFile carga el contenido de un archivo de ensamblaje en la ubicación especificada, por qué está buscando archivos.

documentación de MSDN para LoadFile:

Utilice el método LoadFile para cargar y examinar las asambleas que tienen la misma identidad, pero se encuentran en diferentes caminos. LoadFile no carga archivos en el contexto LoadFrom y no resuelve dependencias utilizando la ruta de carga, como lo hace el método LoadFrom. LoadFile es útil en este escenario limitado porque LoadFrom no se puede usar para cargar ensamblajes que tienen las mismas identidades pero rutas diferentes; cargará solo el primer ensamblaje.

Respuesta

2

Le sugiero que intente una simplificación de su problema porque intenté reproducir su situación y no encontré ningún problema. Creé un ensamblado de Lib.dll, lo compilé, creé una aplicación de consola que lo cargó con LoadFile, luego cambié Lib.dll y la referencia de la consola a "LibNew.dll". Luego volví a compilar lib.dll y ejecuté la aplicación de la consola. En ese momento, no pude eliminar LibNew.dll, pero pude eliminar Lib.dll.

Sospecho que su Lib.dll puede estar cargando información de su propio ensamblado cuando se inicia y está usando internamente otra función de carga para hacerlo, que termina encontrando el Lib.dll original. Pero si tiene una DLL muy simple, no haría esa carga extra. Mi DLL tiene una función, que pude llamar, pero todavía vi mis resultados informados anteriormente. Aquí está mi código:

aplicación de consola:

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Reflection.Assembly assy = System.Reflection.Assembly.LoadFile(args[0]); 
     Type class1 = assy.GetType("Lib.Class1"); 

     System.Reflection.MethodInfo myMethod = class1.GetMethod("MyMethod"); 
     Console.WriteLine(myMethod.Invoke(null, new object[] {"This is a string"}).ToString()); 

     Console.ReadLine(); 
    } 
} 

Lib:

namespace Lib 
{ 
public class Class1 
{ 
    public static string MyMethod(string param) 
    { 
     return "Fixed: [" + param.Replace(" ", "-") + "]"; 
    } 
} 
} 

Monitoreo simplemente LoadImage llama, veo que no trató de cargar Lib.dll: Process Monitor Trace of LoadImage calls

Sin embargo, supervisando todos los eventos, veo que hizo sonda para Lib.dll en la dirección de la aplicación conservador. Process Monitor Trace of all references to Debug\Lib

¿Tal vez si coloca la DLL en otro directorio puede forzar el comportamiento que desea? Sin embargo, es un comportamiento extraño, teniendo en cuenta la documentación.

+0

Gracias BlueMonkMN, esto tiene algo de sentido. Si la Biblioteca se está cargando a sí misma dinámicamente, es posible cargar la biblioteca original, pero el registro del monitor de proceso que adjunté con la publicación se produjo usando la siguiente Lib1 usando el Sistema; espacio de nombres Lib1 { public class Class1 { public void SayHello() { Console.WriteLine ("Class1 :: SayHello"); } } } Puede ejecutar el monitor de procesos y comprobar si la aplicación de consola está intentando cargar los dlls o no. –

+0

Parece que no lo estaba encontrando porque tenía el archivo DLL en un directorio que no era el de la aplicación. – BlueMonkMN

1

LoadFile utiliza la búsqueda de archivos de Windows y no la resolución de ensamblaje de .NET. Pero todavía busca el archivo.

Es similar a llamar al new FileStream() donde puede pasar un nombre de archivo y lo buscará en RUTA, etc. si es una ruta relativa.

+0

LoadFile no funciona con rutas relativas, requiere una ruta absoluta al ensamblado, por lo que no creo que la respuesta anterior sea relevante para esta pregunta. Gracias de todos modos –

Cuestiones relacionadas