Выгрузка файла dll в mef - PullRequest
       16

Выгрузка файла dll в mef

7 голосов
/ 29 февраля 2012

У меня есть несколько плагинов в виде DLL-файлов.Мое приложение загружает dll и работает нормально.но когда я пытаюсь удалить старый плагин и заменить его новым плагином, он не позволяет мне это сделать.как это было загружено приложением.Я обнаружил, что с помощью appdomain мы можем это сделать.но я не могу найти решение, в котором используется mef.

Мне нужен код, который может работать на mef.Ниже мой код, который используется для загрузки плагинов.

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

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Я обнаружил, что с помощью appdomain мы можем это сделать. но я не могу найти решение, в котором используется mef.

К сожалению, это не поддерживается MEF. MEF был разработан специально для расширяемости приложения, а не как система плагинов общего назначения, которая поддерживает выгрузку и замену кода во время выполнения.

Единственный способ выполнить эту работу - использовать MEF в отдельном домене приложений и выгрузить домен приложений в целом. Сам CLR не поддерживает выгрузку загруженной сборки, кроме выгрузки всего домена приложений, в котором эта сборка открыта.

1 голос
/ 13 февраля 2013

Если вы попытаетесь вставить в каталог один объект сборки следующим образом:

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

Вы можете удалить / изменить файл позже ...

...