Cập Nhật Plugin MEF Runtime Số phát hành
Số phát hành
Mã MEF của tôi không cập nhật thích hợp các hội đồng trong thời gian chạy, từ một thư mục liên quan đến một DirectoryCatalog. Các plugin tải tại thời gian chạy succesffully, nhưng khi tôi cập nhật dll và gọi Refresh trên DirectoryCatalog, các assembly không được cập nhật.Bối cảnh
Tôi đang xây dựng một dll có vùng chứa MEF và sử dụng DirectoryCatalog để tìm thư mục plugin cục bộ. Tôi gọi dll này hiện nay từ một WinForm đơn giản, đó là thiết lập với một dự án riêng biệt để sử dụng ShadowCopy vì vậy tôi có thể ghi đè lên các dlls trong thư mục plugin của tôi. Thay vì sử dụng một FileWatcher để cập nhật thư mục này, tôi đang trưng ra một phương thức công khai gọi refresh trên DirectoryCatalog, vì vậy tôi có thể cập nhật các assembly theo ý muốn thay vì tự động.Mã
lớp cơ sở instantiates catalog và container MEF, và lưu lại dưới dạng các biến lớp để truy cập tham chiếu sau
public class FieldProcessor
{
private CompositionContainer _container;
private DirectoryCatalog dirCatalog;
public FieldProcessor()
{
var catalog = new AggregateCatalog();
//Adds all the parts found in the same assembly as the TestPlugin class
catalog.Catalogs.Add(new AssemblyCatalog(typeof(TestPlugin).Assembly));
dirCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory + "Plugin\\");
catalog.Catalogs.Add(dirCatalog);
//Create the CompositionContainer with the parts in the catalog
_container = new CompositionContainer(catalog);
}
public void refreshCatalog()
{
dirCatalog.Refresh();
}
} ...
đây là plugin tôi đang cố gắng để ghi đè lên. Thử nghiệm cập nhật của tôi, là các đoạn mã được trả về là đầu ra cho một hộp văn bản, tôi thay đổi Strings mà plugin đang trả về, xây dựng lại và sao chép nó vào thư mục plugin. Nhưng nó không cập nhật cho các ứng dụng đang chạy, cho đến khi tôi đóng và khởi động lại ứng dụng.
[Export(typeof(IPlugin))]
[ExportMetadata("PluginName", "TestPlugin2")]
public class TestPlugin2 : IPlugin
{
public IEnumerable<IField> GetFields(ContextObject contextObject, params string[] parameters)
{
List<IField> retList = new List<IField>();
//Do Work Return Wrok Results
retList.Add(new Field("plugin.TestPlugin2", "TestPluginReturnValue2"));
return retList;
}
}
Sửa
Nhập Tuyên Bố[ImportMany(AllowRecomposition=true)]
IEnumerable<Lazy<IPlugin, IPluginData>> plugins;
DirectoryCatalog.Refresh sẽ không phát hiện assebmlies được cập nhật. Chỉ những người mới hoặc bị xóa. Có một cái nhìn tại câu trả lời này cho một workaround và gợi ý: http://stackoverflow.com/a/14842417/850119 –
dlls của tôi bị khóa xuống khi chúng được nạp vì vậy tôi không thể ghi đè lên chúng với dlls mới. Bạn không có vấn đề này? bạn đã làm điều gì đó khiến họ có thể cập nhật được hay không. –
vâng, tôi đã có vấn đề này. Một trong những bước tôi đã đề cập trong qua là, cho phép "Shadow Copy". Shadow Copy cho phép một chương trình kéo bản sao cục bộ của các hội đồng dll, và thêm chúng vào một bộ đệm cục bộ, thay vì khóa các dll. Điều này đã được kích hoạt để cho phép bạn "dồn nóng" dll trong thời gian chạy, nếu không bạn cần phải dừng chương trình, thay đổi dlls, và sau đó khởi động lại nó. Tôi nghĩ rằng đây là ví dụ tôi nhìn vào, nhưng nếu nó không làm việc cho bạn google MEF và Shadow Copy, http://stackoverflow.com/questions/12593308/mef-and-shadowcopying-dlls-so-that-i -can-overwrite-them-at-runtime – Madullah