2012-02-26 25 views
6

DirectoryCatalog quét các hội đồng trong một thư mục để xác định các lớp được nhập/xuất. Bất kỳ hội đồng nào không nhập/xuất đều không được tải.DirectoryCatalog của MEF hoạt động như thế nào?

Đây là một tính năng tuyệt vời, nhưng nó hoạt động như thế nào? Để điều tra các thuộc tính tùy chỉnh trên các loại trong một assembly, bạn không cần phải tải Assembly? Một khi nó được tải, nó không thể được dỡ xuống, do đó không thể làm thế nào nó hoạt động.

Ứng dụng có thực hiện một số loại ma thuật AppDomain không?

Trả lời

10

Hãy dùng thử. DirectoryCatalog chỉ cần tạo một AssemblyCatalog cho mọi tệp .dll trong thư mục đã cho. Bởi vì AssemblyCatalog cuộc gọi AssemblyName.GetAssemblyName, các tệp không phải.NET .dll sẽ không được tải (ngoại lệ được ném và bị bắt trong phạm vi AssemblyCatalog). AssemblyCatalog gọi Assembly.Load trên AssemblyName được tạo. Do đó, các assembly được nạp ngay lập tức khi tạo một DirectoryCatalog. Không có phép thuật, không AppDomains. Nhưng sau đó MEF nổi tiếng để tải các cụm vào hiện tại AppDomain. Sử dụng MAF nếu bạn muốn các hội đồng có thể được dỡ xuống.

+0

Thật không may, MAF khá lỗi thời và đi kèm với một số lượng hạn chế đáng kể do việc sử dụng từ xa. Tôi chưa xác định được giải pháp thay thế tốt. Tôi đã không nhận ra rằng MEF tải các hội đồng, mặc dù. –

+0

Ý bạn là "hội đồng có thể được dỡ hàng"? – Assimilater

1

đây là mã mẫu có thể giúp bạn.

var directoryPath = "Dll folder path"; 

//Load parts from the available dlls in the specified path using the directory catalog 
var directoryCatalog = new DirectoryCatalog(directoryPath, "*.dll"); 

//Creating an instance of aggregate catalog. It aggregates other catalogs 
var aggregateCatalog = new AggregateCatalog(); 
aggregateCatalog.Catalogs.Add(directoryCatalog); 

//Crete the composition container 
var container = new CompositionContainer(aggregateCatalog); 

container.ComposeParts(this); 


[ImportMany] 
public List<IModule> Modules { get; set; } 
+4

Điều này giúp trả lời câu hỏi của tôi như thế nào? –

+0

đây là việc triển khai danh mục thư mục. cách bạn có thể sử dụng mã này để lấy các mô-đun, –

+4

Làm thế nào điều đó có liên quan đến câu hỏi của tôi? –

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