Wydanie aktualizacji wtyczki MEF Runtime Wydanie
Numer
Mój kod MEF nie aktualizuje prawidłowo złożeń w czasie wykonywania, z folderu powiązanego z katalogiem katalogowym. Wtyczki ładują się w czasie wykonywania, ale gdy zaktualizuję bibliotekę DLL i wywołasz Refresh w katalogu DirectoryCatalog, złoŜenia nie są aktualizowane.Tło
buduję dll, który ma MEF pojemnik i wykorzystuje DirectoryCatalog znaleźć folder wtyczek lokalnej. Obecnie nazywam tę bibliotekę dll z prostego WinForm, czyli z osobnym projektem do używania ShadowCopy, dzięki czemu mogę nadpisać biblioteki DLL w folderze wtyczek. Zamiast korzystać z FileWatchera w celu aktualizacji tego folderu, ujawniam publiczną metodę, która wywołuje odświeżenie w DirectoryCatalog, więc mogę aktualizować zestawy bez zmian, automatycznie.Kod
klasa bazowa instancję katalogi MEF i pojemnik, i zapisuje je jako zmienne klasy dostęp do referencyjnego później
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();
}
} ...
oto plugin próbuję zastąpić. Mój test aktualizacji polega na tym, że zwrócone żądła są wyprowadzane do pola tekstowego, zmieniam ciągi znaków, które wtyczka powraca, przebudowuje i kopiuje do folderu wtyczek. Ale nie aktualizuje się dla uruchomionej aplikacji, dopóki nie zamknę i nie uruchomię ponownie aplikacji.
[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;
}
}
Edit
komunikat importu[ImportMany(AllowRecomposition=true)]
IEnumerable<Lazy<IPlugin, IPluginData>> plugins;
DirectoryCatalog.Refresh będzie nie wykrywa zaktualizowanych assebmlies. Tylko nowe lub usunięte. Rzuć okiem na tę odpowiedź dla obejścia i sugestie: http://stackoverflow.com/a/14842417/850119 –
Moje biblioteki DLL są zablokowane, gdy są one ładowane, więc nie mogę zastąpić je nowymi bibliotekami dll. Czy nie masz tego problemu? czy zrobiłeś coś, co uczyniło je aktualizowalnym. –
Tak, miałem ten problem. Jednym z kroków, o których wspomniałem, było "Włączenie kopiowania". Shadow Copy umożliwia programowi pobieranie lokalnych kopii bibliotek dll i dodawanie ich do lokalnej pamięci podręcznej, zamiast blokowania bibliotek dll. To musi być włączone, aby umożliwić ci "hot swap" biblioteki DLL podczas wykonywania, w przeciwnym razie musisz zatrzymać program, zmienić biblioteki DLL, a następnie uruchom go ponownie. Myślę, że jest to przykład, na który patrzyłem, ale jeśli to nie działa, to google MEF i Shadow Copy, http://stackoverflow.com/questions/12593308/mef-and-shadowcopying-dlls-so-that-i -can-overwrite-them-at-runtime – Madullah