Каков рекомендуемый способ запуска плагинов с зависимостями 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 загрузить все зависимости плагинов?

Я прочитал о нескольких решениях в Интернете:

  1. Создайте новый домен приложения для каждого плагина - я не хочу туда идти.

  2. Использовать <dependentAssembly> - Это не сработало, когда я впервые попробовал это сделать, и я не хочу, чтобы мой сервер плагинов обновлялся при каждом изменении версии зависимости сборки. Кроме того, я хочу иметь возможность запускать плагины с различными версиями сборки.

  3. Подписать сборки с помощью snk - я еще не пробовал, и я не уверен, что это решение будет работать. Как фреймворк узнает, что ему нужно загрузить другую сборку? Чем это отличается от сборок с разными версиями? Нужно ли мне как-то настраивать свой сервис, чтобы это работало?

У кого-нибудь есть идея получше? Каков рекомендуемый способ запуска изолированных плагинов?

1 ответ

Вы должны подписать свои сборки и убедиться, что версия сборки отличается на каждой. Смотрите ответ из следующего: C# Загрузка разных версий сборки в один и тот же проект

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

Другие вопросы по тегам