2009-08-17 10 views
30

In un'applicazione Web, voglio caricare tutti gli assembly nella directory/bin.come caricare tutti gli assembly dalla directory/bin

Poiché questo può essere installato ovunque nel file system, non è possibile garantire un percorso specifico in cui è memorizzato.

Desidero una lista <> di oggetti Assembly Assembly.

risposta

35

Beh, si può incidere questo insieme da soli con i seguenti metodi, inizialmente usare qualcosa come:

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

per ottenere il percorso alla vostra assemblea corrente. Quindi, scorrere tutte le DLL nel percorso utilizzando il metodo Directory.GetFiles con un filtro adatto. Il tuo codice finale dovrebbe essere simile:

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)); 

prega di notare che non ho ancora testato questo modo potrebbe essere necessario verificare che DLL contiene in realtà il percorso completo (e concatenare percorso, se non lo fa)

+2

Probabilmente si vorrà anche per aggiungere un controllo per assicurarti di non aggiungere l'assembly che stai effettivamente eseguendo :) – Wolfwyrd

+8

La variabile 'path' contiene il nome file della directory, deve essere abbreviato con' Path.GetDirectoryName (path) ' – cjk

+0

È stato aggiornato per riflettere il commento sopra. –

4

Puoi farlo in questo modo, ma probabilmente non dovresti caricare tutto nell'appodominio attuale come questo, poiché gli assembly potrebbero contenere codice dannoso.

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: non ho ancora testato il codice (non ha accesso a Visual Studio a questo computer), ma spero che si ottiene l'idea.

41

Per ottenere la directory bin, string path = Assembly.GetExecutingAssembly().Location; fa NON funziona sempre (soprattutto quando l'assembly in esecuzione è stato inserito in una directory temporanea ASP.NET).

Invece, si dovrebbe utilizzare string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

Inoltre, si dovrebbe probabilmente prendere la FileLoadException e BadImageFormatException in considerazione.

Qui è la mia funzione di lavoro:

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

La directory "bin" non esiste necessariamente in un'applicazione .NET distribuita . Dovresti notare che la tua soluzione funziona solo per ASP.NET. – BSick7

+0

L'ubicazione della directory "bin" si trova nell'oggetto AppDomain.SetupInfomation. Utilizzo come tale: var assemblyembersir = setup.PrivateBinPathProbe! = Null ? setup.PrivateBinPath: setup.ApplicationBase; –

-2

So che questa è una domanda vecchia ma ...

System.AppDomain.CurrentDomain.GetAssemblies()

+9

Credo che questo restituisca solo gli assembly a cui fa riferimento l'assembly chiamante (tutti gli assembly da cui dipende l'assembly corrente). Ciò non equivale necessariamente a tutti gli assembly presenti nella directory di esecuzione. http://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx – Jason

Problemi correlati