Reputation: 7277
I have some plugins as dll files. My application loads the dll and it runs fine. but when I try to delete the old plugin and replace it with a new plugin it doesn't allow to do me. as it has been loaded by application. I have found that by using appdomain we can do that. but I am not able to find a solution in which mef is used.
I need a code which can run on mef. Below is my code which is used to load plugins.
//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);
Upvotes: 9
Views: 4692
Reputation: 101
If you try to insert on catalog one Assembly Object like this:
Assembly assembly = Assembly.Load(System.IO.File.ReadAllBytes(Path.Combine(directoryPath, ItemPlugin)));
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly));
You can Delete/Change the file later...
Upvotes: 2
Reputation: 564403
i have found that by using appdomain we can do that. but i am not able to find a solution in which mef is used.
Unfortunately, this is not supported by MEF. MEF was designed specifically for application extensibility, not as a general purpose plugin system which supports unloading and replacement of code at runtime.
The only way to make this work would be to use MEF within a separate AppDomain, and unload the AppDomain as a whole. The CLR itself has no support for unloading a loaded assembly other than unloading the entire AppDomain in which the assembly is opened.
Upvotes: 5