Наша надстройка медиацентра поставляется в виде единой библиотеки DLL, которая находится в GAC (mediabrowser.dll), мы позволяем пользователям писать расширения для нашей надстройки, ссылаясь на нашу DLL и получая доступ к предопределенным точкам расширения.
При загрузке мы ищем в каталоге подключаемого модуля, загружаем все сборки в каталоге, ищем в сборках тип, реализующий IPlugin, и выполняем процедуру инициализации на экземпляре плагина. Я знаю, что это не самый надежный дизайн (например: мы можем захотеть взглянуть на изоляцию appdomain для плагина позже), но теперь он работает нормально.
Похоже, что это работает нормально, за исключением одного большого предостережения.
Когда авторы плагинов компилируют свои плагины, плагин ссылается на mediabrowser.dll с определенной версией. Позже, когда мы пересматриваем нашу dll (чтобы исправить ошибки или добавить функции), все надстройки, которые были написаны для более ранних версий mediabrowser.dll, ломаются.
Я подумал о нескольких решениях этой проблемы (обратите внимание, сборка в GAC):
- Поставьте политику издателя вместе с mediabrowser.dll, которая перенаправит все более ранние совместимые версии mediabrowser.dll в текущую версию (она также должна находиться в GAC).
- Отправьте отдельную сборку, которая содержит все фиксированные точки расширения и контракты, будьте особенно осторожны при изменении этой сборки, попросите авторов плагинов связать эту сборку. (но все же посмотрите на использование политик издателя для непрерывных изменений интерфейсов)
- Пусть третье лицо беспокоится об этом и использует MEF или какую-то другую среду, которая заботится о подобных вещах.
- Подключение AppDomain.CurrentDomain.AssemblyResolve и разрешить более ранние версии сборки в текущей версии. Это будет работать, только если сборка этой конкретной версии отсутствует в GAC.
Существуют ли другие способы решения этой проблемы, которые мне не хватает?
Обновление В итоге я выбрал вариант 4.