2009-08-17 14 views

Odpowiedz

35

Cóż, można siekać tym razem się z następujących metod, początkowo używać coś takiego:

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

uzyskać ścieżkę do bieżącego montażu. Następnie wykonaj iterację wszystkich bibliotek DLL ścieżki, używając metody Directory.GetFiles z odpowiednim filtrem. Twój ostateczny kod powinien wyglądać następująco:

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

Należy pamiętać, że nie testowałem tego, więc może trzeba sprawdzić, czy rzeczywiście dll zawiera pełną ścieżkę (i złączyć ścieżkę jeśli nie)

+2

Pewnie też chcę aby dodać zaznaczenie, aby upewnić się, że nie dodajesz zespołu, który faktycznie działa również :) – Wolfwyrd

+8

Zmienna "ścieżka" zawiera nazwę pliku katalogu, należy ją skrócić za pomocą 'Path.GetDirectoryName (ścieżka)' – cjk

+0

zostały zaktualizowane, aby odzwierciedlić powyższy komentarz. –

4

Możesz to zrobić w ten sposób, ale prawdopodobnie nie należy ładować wszystkiego do bieżącej aplikacji, ponieważ assemblowanie może zawierać szkodliwy kod.

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

EDYCJA: Nie przetestowałem kodu (brak dostępu do Visual Studio na tym komputerze), ale mam nadzieję, że masz pomysł.

41

Aby uzyskać katalog bin, zawsze działa string path = Assembly.GetExecutingAssembly().Location; NOT (szczególnie, gdy zespół wykonawczy został umieszczony w tymczasowym katalogu ASP.NET).

Zamiast tego należy użyć string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

Ponadto, powinieneś wziąć FileLoadException i BadImageFormatException pod uwagę.

Oto moja funkcja robocza:

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

Katalog "bin" niekoniecznie będzie istnieć w wdrożonej aplikacji .NET . Należy zauważyć, że twoje rozwiązanie działa tylko w ASP.NET. – BSick7

+0

Lokalizacja katalogu "bin" znajduje się w obiekcie AppDomain.SetupInfomation. Użycie jako takie: var assembliesDir = setup.PrivateBinPathProbe! = Null ? setup.PrivateBinPath: setup.ApplicationBase; –

-2

wiem, że jest to stare pytanie, ale ...

System.AppDomain.CurrentDomain.GetAssemblies()

+9

Wierzę, że to zwraca tylko zespoły, do których odwołuje się zestaw wywołujący (wszystkie złożenia, od których zależy bieżący zestaw). To niekoniecznie oznacza wszystkie zespoły obecne w katalogu wykonawczym. http://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx – Jason

Powiązane problemy