2013-03-02 2 views
3

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

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

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

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

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

Пример 1

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

--- Это кажется решения, кажется, немного грязный

Пример 2

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

--- это также, кажется, немного грязный

если у кого есть какие-либо поправки к моим предположениям или подстрекать к успешной стратегии в моей достичь своей цели, идентификатор быть один счастливый разработчик

Благодаря

ответ

3

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

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

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

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

Посмотрите на это answer на примере MEF + Versioning.

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

  • Нового плагина сборка добавлена ​​
  • Узел плагина удаляется
  • Узел плагина заменяются

Посмотрите на этот пример question.

+0

Спасибо за подробные ответы и ссылки, очень интересные, полные оценки :) –