Подтвердить что ты не робот

Как удалить плагины MEF во время выполнения?

У меня есть приложение на основе MEF, которое можно настроить с помощью плагинов. Это приложение имеет несколько импортированных частей, и я хочу удалить некоторые из них во время выполнения (чтобы удалить DLL, содержащую их), когда пользователь решает избавиться от этого плагина.

CompositionBatch будет делать то, что мне нужно, но ему нужны ComposablePart экземпляры в качестве входных параметров для RemovePart(), и у меня есть только простые объекты, которые реализуют интерфейс ISomething или ComposablePartDefinition экземпляры в AggregateCatalog. Поэтому мой вопрос:

  • Как найти ComposablePart экземпляр, который представляет импортированный объект, из которого я хочу избавиться?
  • Или альтернативно: как мне получить список объектов ComposablePart, которые принадлежат к определенному .dll?

Я бы использовал следующее:

var parts = Container.Catalog.Parts
           .Where(p => iDontNeed(p))
           .Select(p => howDoIConvertComposablePartDefinition2ComposablePart(p));
var batch = new CompositionBatch();
parts.ToList().ForEach(part => batch.RemovePart(part));

Спасибо

4b9b3361

Ответ 1

как мне получить список объектов ComposablePart, принадлежащих определенному .dll?

Чтобы удалить детали из определенной сборки, вы можете просто удалить это AssemblyCatalog, вызвав AggregateCatalog.Catalogs.Remove. Вы должны будете проектировать свои части, чтобы позволить Recomposition, хотя.

Однако это не поможет вам удалить сборку плагина. Сборка все равно будет загружена, и вы не сможете изменить или удалить сборку .NET во время ее загрузки. Единственный способ разгрузить сборку без остановки процесса - выгрузить AppDomain, в который он загрузился. Но если вы введете отдельный AppDomain для плагинов, тогда вам в основном придется общаться с этими плагинами через удаленный доступ и т.д.

Возможно, гораздо проще, безопаснее и эффективнее просто остановить приложение, удалить сборку плагинов и перезапустить.

edit: на самом деле есть способ удалить файл плагина dll, не останавливая процесс или выгружая весь appdomain: вы можете включить теневое копирование для домена приложения, чтобы указать .NET сделать копию перед загрузкой сборки. Копия останется загруженной, но по крайней мере вы можете удалить или заменить исходный файл.

Ответ 2

Может ли MAF помочь вам здесь? Я не эксперт, но я понимаю, что с MAF аддины остаются в своем собственном процессе и могут быть выгружены во время выполнения. Я бы предположил, что это не даст идеальной производительности, поскольку вы сообщаете кросс-процесс, но если это не серьезная проблема, стоит взглянуть на нее.