2009-08-17 30 views
30

Trong một ứng dụng web, tôi muốn tải tất cả các assembly trong thư mục/bin.cách tải tất cả các cụm từ trong thư mục/bin của bạn

Vì điều này có thể được cài đặt ở bất cứ đâu trong hệ thống tệp, tôi không thể bảo đảm một đường dẫn cụ thể nơi lưu trữ.

Tôi muốn có một Danh sách <> của các đối tượng lắp ráp hội.

Trả lời

35

Vâng, bạn có thể hack này cùng chính mình với các phương pháp sau đây, ban đầu sử dụng một cái gì đó như:

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

để có được con đường để lắp ráp hiện tại của bạn. Tiếp theo, lặp qua tất cả các DLL trong đường dẫn bằng phương thức Directory.GetFiles với một bộ lọc phù hợp. mã cuối cùng của bạn sẽ giống như thế:

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

Xin lưu ý rằng tôi đã không kiểm tra này, do đó bạn có thể cần phải kiểm tra dll mà thực sự có chứa đường dẫn đầy đủ (và nối đường dẫn nếu nó không)

+2

Bạn sẽ có lẽ cũng muốn để thêm một kiểm tra để đảm bảo bạn không thêm Assembly mà bạn đang thực sự đang chạy :) – Wolfwyrd

+8

Biến 'path' chứa tên tập tin thư mục, nó cần phải được rút ngắn bằng' Path.GetDirectoryName (đường dẫn) ' – cjk

+0

đã được cập nhật để phản ánh nhận xét ở trên. –

4

Bạn có thể làm như thế này, nhưng có lẽ bạn không nên tải mọi thứ vào miền ứng dụng hiện tại như thế này, vì các hội đồng có thể chứa mã độc hại.

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: Tôi chưa thử nghiệm mã (không truy cập vào Visual Studio tại máy tính này), nhưng tôi hy vọng bạn có ý tưởng.

41

Để có được thư mục bin, string path = Assembly.GetExecutingAssembly().Location; không NOT luôn hoạt động (đặc biệt khi assembly thực thi được đặt trong một thư mục tạm thời ASP.NET).

Thay vào đó, bạn nên sử dụng string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin");

Hơn nữa, có lẽ bạn nên đưa ra fileloadexception và BadImageFormatException vào xem xét.

Đây là chức năng làm việc của tôi:

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

Thư mục "bin" sẽ không nhất thiết tồn tại trong một Ứng dụng .NET được triển khai . Bạn nên lưu ý rằng giải pháp của bạn chỉ hoạt động cho ASP.NET. – BSick7

+0

Vị trí của thư mục "bin" nằm trong đối tượng AppDomain.SetupInfomation. Cách sử dụng như vậy: tập hợp varDir = setup.PrivateBinPathProbe! = Null ? setup.PrivateBinPath: thiết lập.ApplicationBase; –

-2

Tôi biết đây là một câu hỏi cũ nhưng ...

System.AppDomain.CurrentDomain.GetAssemblies()

+9

Tôi tin rằng điều này chỉ trả về các hội đồng được tham chiếu bởi hội đồng gọi (tất cả các hội đồng lắp ráp hiện tại phụ thuộc vào). Điều này không nhất thiết phải tương đương với tất cả các assembly có trong thư mục thực hiện. http://msdn.microsoft.com/en-us/library/system.appdomain.getassemblies.aspx – Jason

Các vấn đề liên quan