Каков рекомендуемый способ запуска плагинов с зависимостями DLL, которые имеют разные версии?
У меня есть служба плагинов WCF, которая загружает плагины через MEF и запускает их.
Каждый плагин представляет собой каталог с несколькими DLL, который реализует определенный интерфейс.
Я загружаю все плагины в одном AppDomain, используя MEF (DirectoryCatalog
) и запустить их в общем виде (используя отражение).
Теперь давайте предположим, что у меня есть два плагина с зависимостями dll:
Plugin1
----> Entities 1.0.0.1
Plugin2
----> Entities 1.0.0.2
Я добавил несколько новых сущностей в 1.0.0.2.
Когда я запускаю плагин, я получаю спорадическую ошибку, что новые объекты не существуют в DLL.
Я думаю, что ошибка возникает, так как я запускаю код в том же AppDomain и первый Entities.dll
Это загружает тот, который будет обслуживать все мои плагины.
Итак, как я могу запустить каждый плагин изолированно, без создания нового домена приложения?
Есть ли способ, как я могу сказать MEF загрузить все зависимости плагинов?
Я прочитал о нескольких решениях в Интернете:
Создайте новый домен приложения для каждого плагина - я не хочу туда идти.
Использовать
<dependentAssembly>
- Это не сработало, когда я впервые попробовал это сделать, и я не хочу, чтобы мой сервер плагинов обновлялся при каждом изменении версии зависимости сборки. Кроме того, я хочу иметь возможность запускать плагины с различными версиями сборки.Подписать сборки с помощью snk - я еще не пробовал, и я не уверен, что это решение будет работать. Как фреймворк узнает, что ему нужно загрузить другую сборку? Чем это отличается от сборок с разными версиями? Нужно ли мне как-то настраивать свой сервис, чтобы это работало?
У кого-нибудь есть идея получше? Каков рекомендуемый способ запуска изолированных плагинов?
1 ответ
Вы должны подписать свои сборки и убедиться, что версия сборки отличается на каждой. Смотрите ответ из следующего: C# Загрузка разных версий сборки в один и тот же проект
CLR поддерживает загрузку нескольких версий строго именованных сборок в один и тот же домен приложений. Это работает только в том случае, если ваши сборки имеют строгое имя и каждая версия отличается от другой.