Стратегии обновления плагина MEF для winforms

Я разрабатываю расширяемое приложение с помощью MEF. В приложении будет много типов плагинов для сбора и обработки данных разными способами.

Я думаю о создании версионного онлайн-репозитория для подключаемых модулей, который позволит пользователю загружать новые версии подключаемых модулей, когда они станут доступны.

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

Поэтому я смирился с тем, что мне нужно будет обновить плагин и заархивировать предыдущую версию.

Какая стратегия для этого была бы лучшей?

Пример 1

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

--- Кажется, решения кажутся немного запутанными

Пример 2

Приложение загружает новую версию загруженного работающего плагина. Плагин заключен в какой-то установщик. Установщик корректно закрывает хост и архивирует существующий плагин. Установщик устанавливает новый плагин и перезапускает хост-приложение.

--- это тоже кажется немного беспорядочным

Я стремлюсь к исправлению своих предположений или к пониманию успешной стратегии достижения моей цели.


person TheGeneral    schedule 02.03.2013    source источник


Ответы (1)


В .NET Framework есть опасение под названием Shadow Copy, которое позволяет вам обновить загруженные сборки. Обычно он копирует сборки во временную папку и загружает их оттуда. Таким образом, сборки, расположенные в папке установки вашего приложения, не будут заблокированы ОС, и вы сможете их заменить. ASP.NET, framweorks для модульных тестов и многие другие приложения используют теневое копирование.

Чтобы включить эту функцию, вам нужно будет загрузить свое приложение в новом AppDomain, поскольку вы не можете включить теневое копирование на главном AppDomain. Вы можете создать простой загрузчик, который создаст AppDomain и выполнит ваше приложение там. Это очень просто. В качестве примера MEF + Shadow Copy посмотрите Способ MEF и, в частности, образец PartUpdatesInPlace.

Теперь, что касается управления версиями, вам потребуется иметь возможность одновременно загружать две или более версий сборки в один и тот же домен приложения. Есть два способа сделать это:

  1. Сборки со строгими именами в GAC.
  2. Сборки, в названии которых указана версия (например, Plugin.v1.dll). Сильное именование в этом случае необязательно, но, тем не менее, это хорошая идея. Преимущество этого подхода состоит в том, что две или более версий плагина могут сосуществовать в одном каталоге.

Взгляните на этот ответ, чтобы увидеть пример управления версиями MEF +.

Вы даже можете использовать функцию перекомпоновки MEF и обновить контейнер плагина после:

  • Добавлена ​​новая сборка плагина
  • Сборка плагина удалена
  • Заменена сборка плагина

Взгляните на этот вопрос в качестве примера.

person Panos Rontogiannis    schedule 02.03.2013
comment
Спасибо за подробные ответы и ссылки, очень поучительные, полные оценки :) - person TheGeneral; 03.03.2013