2012-02-29 37 views
6

Tôi có một số plugin dưới dạng tệp dll. Ứng dụng của tôi tải dll và nó chạy tốt. nhưng khi tôi cố gắng xóa các plugin cũ và thay thế nó bằng một plugin mới, nó không cho phép tôi làm điều đó. vì nó đã được tải bởi ứng dụng. Tôi đã thấy rằng bằng cách sử dụng appdomain chúng ta có thể làm điều đó. nhưng tôi không thể tìm thấy một giải pháp trong đó mef được sử dụng.Dỡ một tập tin dll vào mef

Tôi cần mã có thể chạy trên mef. Dưới đây là mã của tôi được sử dụng để tải các plugin.

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

//Build the directory path where the parts will be available 
var directoryPath = "Path to plugins folder"; 

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

//Add to the aggregate catalog 
aggregateCatalog.Catalogs.Add(directoryCatalog); 

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


// Composable parts are created here i.e. the Import and Export components assembles here 
container.ComposeParts(this); 

Trả lời

4

tôi đã nhận thấy rằng bằng cách sử dụng appdomain, chúng tôi có thể làm điều đó. nhưng tôi không thể tìm thấy một giải pháp trong đó mef được sử dụng.

Thật không may, điều này không được MEF hỗ trợ. MEF được thiết kế đặc biệt cho khả năng mở rộng ứng dụng, không phải là một hệ thống plugin mục đích chung hỗ trợ dỡ và thay thế mã khi chạy.

Cách duy nhất để thực hiện công việc này là sử dụng MEF trong một AppDomain riêng biệt và dỡ toàn bộ AppDomain. Bản thân CLR không có hỗ trợ cho việc dỡ bỏ một assembly được nạp khác ngoài việc dỡ toàn bộ AppDomain trong đó assembly được mở ra.

+0

cần có một giải pháp này. tôi nghe nói rằng điều này sẽ được phát hành tiếp theo. không biết đó là sự thật hay không. –

+1

@fhnaseer Không - ít nhất là không có bất cứ điều gì được hiển thị công khai cho đến nay. Điều này thực sự nằm ngoài trường hợp sử dụng dự định cho MEF, vì vậy tôi nghi ngờ nó sẽ xảy ra ở đó. Cách duy nhất được hỗ trợ để loại bỏ một assembly trong CLR là dỡ bỏ toàn bộ AppDomain. MEF, là một thư viện, không thể "làm việc xung quanh" được điều đó. –

+0

thì ý nghĩa của "AllowRecomposition = true" trong ImportMany là gì. Nếu tôi viết nó hay hành vi không giống nhau. –

1

Nếu bạn cố gắng chèn vào Danh mục một hội Object như thế này:

Assembly assembly = Assembly.Load(System.IO.File.ReadAllBytes(Path.Combine(directoryPath, ItemPlugin))); 
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly)); 

Bạn có thể Xóa/Thay đổi tập tin sau ...

+1

Bạn có thể xóa nó khỏi aggregateCatalog nhưng bạn sẽ không thể dỡ bỏ assembly từ appdomain mà không cần dỡ bỏ appdomain lỗ. – Peter

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