2009-08-17 15 views

Respuesta

35

Bueno, se puede cortar esta junto a ti mismo con los métodos siguientes, utilice inicialmente algo como:

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

para obtener la ruta a su montaje actual. A continuación, itere sobre todas las DLL en la ruta utilizando el método Directory.GetFiles con un filtro adecuado. Su código final debe ser similar:

List<Assembly> allAssemblies = new List<Assembly>(); 
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

foreach (string dll in Directory.GetFiles(path, "*.dll")) 
    allAssemblies.Add(Assembly.LoadFile(dll)); 

Tenga en cuenta que no he probado esto por lo que puede que tenga que comprobar que DLL en realidad contiene la ruta completa (y concatenar ruta si no lo hace)

+2

Es posible que también desee para agregar una marca de verificación para asegurarse de no agregar también el ensamblado que está ejecutando realmente :) – Wolfwyrd

+8

La variable 'ruta' contiene el nombre de archivo del directorio, debe acortarse con' Path.GetDirectoryName (ruta) ' – cjk

+0

Es sido actualizado para reflejar el comentario anterior. –

4

Puede hacerlo así, pero probablemente no debería cargar todo en el dominio de aplicación actual de esta manera, ya que los ensamblados pueden contener código dañino.

public IEnumerable<Assembly> LoadAssemblies() 
{ 
    DirectoryInfo directory = new DirectoryInfo(@"c:\mybinfolder"); 
    FileInfo[] files = directory.GetFiles("*.dll", SearchOption.TopDirectoryOnly); 

    foreach (FileInfo file in files) 
    { 
     // Load the file into the application domain. 
     AssemblyName assemblyName = AssemblyName.GetAssemblyName(file.FullName); 
     Assembly assembly = AppDomain.CurrentDomain.Load(assemblyName); 
     yield return assembly; 
    } 

    yield break; 
} 

EDIT: No he probado el código (no hay acceso a Visual Studio en este equipo), pero espero que se entiende la idea.

41

Para obtener el directorio bin, string path = Assembly.GetExecutingAssembly().Location; hace NOT siempre funciona (especialmente cuando el ensamblaje de ejecución se ha colocado en un directorio temporal de ASP.NET).

su lugar, debe utilizar string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

Además, probablemente debería tomar la FileLoadException y BadImageFormatException en consideración.

Aquí es mi función de trabajo:

public static void LoadAllBinDirectoryAssemblies() 
{ 
    string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin"); // note: don't use CurrentEntryAssembly or anything like that. 

    foreach (string dll in Directory.GetFiles(binPath, "*.dll", SearchOption.AllDirectories)) 
    { 
    try 
    {      
     Assembly loadedAssembly = Assembly.LoadFile(dll); 
    } 
    catch (FileLoadException loadEx) 
    { } // The Assembly has already been loaded. 
    catch (BadImageFormatException imgEx) 
    { } // If a BadImageFormatException exception is thrown, the file is not an assembly. 

    } // foreach dll 
} 
+8

El directorio "bin" no existirá necesariamente en una aplicación .NET desplegada. . Debe tener en cuenta que su solución solo funciona para ASP.NET. – BSick7

+0

La ubicación del directorio "bin" se encuentra en el objeto AppDomain.SetupInfomation. Uso como tal: var assembliesDir = setup.PrivateBinPathProbe! = Null ? setup.PrivateBinPath: configuración.ApplicationBase; –

-2

Sé que esto es una cuestión de edad, pero ...

System.AppDomain.CurrentDomain.GetAssemblies()

+9

Creo que esto solo devuelve los ensamblajes a los que hace referencia el ensamblado que realiza la llamada (todos los ensamblajes de los que depende el ensamblaje actual). Esto no necesariamente equivale a todos los ensambles presentes en el directorio de ejecución. http://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx – Jason

Cuestiones relacionadas