2012-02-29 15 views
6

Mam niektóre wtyczki jako pliki DLL. Moja aplikacja ładuje bibliotekę dll i działa dobrze. ale kiedy próbuję usunąć starą wtyczkę i zastąpić ją nową wtyczką, nie pozwala mi to zrobić. ponieważ został załadowany przez aplikację. Odkryłem, że używając aplikacji appdomain możemy to zrobić. ale nie jestem w stanie znaleźć rozwiązania, w którym stosowany jest mef.Rozładowywanie pliku dll w formacie MFC

Potrzebuję kodu, który można uruchomić na mef. Poniżej znajduje się mój kod służący do ładowania wtyczek.

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

Odpowiedz

4

i odkryli, że za pomocą AppDomain możemy zrobić. ale nie jestem w stanie znaleźć rozwiązania, w którym używany jest mef.

Niestety, nie jest to obsługiwane przez MEF. MEF został zaprojektowany specjalnie do rozszerzania aplikacji, a nie jako ogólny system wtyczek, który obsługuje rozładowywanie i zastępowanie kodu w czasie wykonywania.

Jedynym sposobem na wykonanie tej pracy byłoby użycie MEF w oddzielnym AppDomain i zwolnienie AppDomain jako całości. Sam CLR nie ma wsparcia dla rozładowania załadowanego zespołu innego niż rozładowanie całej AppDomain, w którym zespół jest otwarty.

+0

nie powinno być rozwiązaniem tego. Słyszałem, że będzie to w następnym wydaniu. nie wiem, czy to prawda, czy nie. –

+1

@fhnaseer Nope - przynajmniej nie w niczego publicznie pokazanego do tej pory. W rzeczywistości jest to poza zamierzonym przypadkiem użycia MEF, więc wątpię, że to się stanie. Jedynym obsługiwanym sposobem usuwania zespołu w CLR jest zwolnienie całego AppDomain. MEF, będąc biblioteką, nie może tego "obejść". –

+0

co to jest znaczenie "AllowRecomposition = true" w ImportMany. Jeśli to piszę, zachowanie jest takie samo. –

1

Jeśli próbujesz wstawić na katalogu jeden obiekt Zgromadzenie tak:

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

można usunąć/zmienić plik później ...

+1

Możesz usunąć go z aggregateCatalog, ale nie będziesz w stanie wyładować złożenia z appdomain bez rozładowywania dziurki appdomain. – Peter