2009-07-21 19 views
10

Tengo un nombre de archivo, como "Foo.dll", para una biblioteca que sé que está en el directorio bin. Quiero crear un objeto Assembly para él. Intento crear una instancia de este objeto de una clase que no es una página, por lo que no tengo el objeto Request para obtener la ruta. ¿Cómo obtengo el camino que necesito para usar Assembly.Load()?Cargar un ensamblaje desde el contenedor en ASP.NET

Respuesta

15

Assembly.Load no debería requerir una ruta de archivo, sino que requiere un AssemblyName. Si sabe que su ensamblado se encuentra en la ruta de búsqueda estándar (es decir, el directorio bin), no necesita conocer la ruta del disco del ensamblado ... solo necesita conocer su nombre de ensamblado. En el caso de que su montaje, suponiendo que no necesita una versión específica, la cultura, etc., el nombre del ensamblado debe ser sólo "Foo":

Assembly fooAssembly = Assembly.Load("Foo"); 

Si necesita cargar una versión específica, haría lo siguiente:

Assembly fooAssembly = Assembly.Load("Foo, Version=1.1.2, Culture=neutral"); 

general, que desea utilizar Assembly.Load, en lugar de Assembly.LoadFrom o Assembly.LoadFile. LoadFrom y LoadFile funcionan fuera del proceso de fusión estándar, y pueden provocar que los ensamblajes se carguen más de una vez, cargados desde ubicaciones inseguras, etc. Assembly.Load realiza una carga "estándar", buscando ubicaciones de ensamblaje estándar como bin, GAC , etc., y aplica todas las verificaciones de seguridad estándar.

+2

alternativamente si ya tiene un objeto de un tipo en ese ensamblaje puede hacer algo como: obj.GetType(). –

2

¿Funciona Assembly.LoadFile (...)?

+0

Er, seguro si conoce la ruta absoluta. Supongo que esa es la parte importante de la pregunta. –

1

Según su descripción, parece que se trata de una aplicación web, por lo tanto, a menos que esté en un hilo asíncrono generado por una solicitud, aún debe tener acceso al HttpContext. Desde allí, puede usar Server.MapPath() en el archivo que necesita.

0

Un ejemplo completo como el que uso, si ayuda. Recursos es una carpeta en la raíz de la Biblioteca DLL (Asamblea)

 public static string ReadAssemblyResourceFile(string resourcefilename) 
     { 
using (var stream = Assembly.Load("GM.B2U.DAL").GetManifestResourceStream("GM.B2U.DAL.Resources." 
    + resourcefilename))   { 
        if (stream == null) throw new MyExceptionDoNotLog($"GM.B2U.DAL.Resources.{resourcefilename} not found in the Assembly GM.B2U.DAL.dll !"); 
        using (var reader = new StreamReader(stream)) 
        { 
         return reader.ReadToEnd(); 
        }   
       } 
     } 

llamar a la función:

[TestMethod()] 
public void ReadAssemblyResourceFileTest() 
{ 
    var res = SetupEngine.ReadAssemblyResourceFile("newdb.sql"); 
    Assert.IsNotNull(res); 
} 

ps. No olvide marcar "Acción de compilación" como "Recurso incrustado" (en la ventana de propiedades) de cada archivo de recursos.

Cuestiones relacionadas