2014-09-23 4 views
2

Для приложения, которое я создаю, мы используем MEF для создания плагина. Каждый плагин построен с собственными зависимостями (ссылками) и, в конце концов, скопирован в назначенную папку, которую приложение знает и ищет плагины. Копирование выполняется с помощью сценария post-build btw.MEF - Плагины и их ссылочные сборки

Проблема в том, что у нас есть отдельные плагины, которые могут ссылаться на разные версии одной и той же сборки. Для этого у нас возникла идея, что каждый плагин должен создать свою собственную папку в папке плагина, чтобы держать сборки от переопределения друг друга. Но потом мы получаем исключения, потому что AppDomain не знает, нужно ли искать ссылки, необходимые для плагинов. Мы обнаружили, что мы можем предоставить пути с зондированием. Но это означало бы необходимость регистрировать каждый плагин в app.config. И мы стремились сделать это более общим образом.

Приложение не является веб-приложением. Это консольное приложение, которое будет служить сервером, и мы называем это оболочкой. Сборы не известны оболочке, а только плагинам оболочки. Эти плагины не известны оболочке, но скорее обнаружены MEF. Единственное, что склеивает оболочку и плагины, - это интерфейсы.

Я действительно застрял на этом изделии и буду признателен за любую помощь, которую я могу получить по этому вопросу. Это скорее вопрос .Net, чем MEF, но я думал, что дам эскиз ситуации.

+0

Посмотрите на метод 'BuildManager.AddReferencedAssembly' и' PreApplicationStartMethodAttribute'. С его помощью вы можете добавить сборки в набор ссылочных сборок приложения на раннем этапе жизненного цикла. Я не уверен, что они могут помочь вам с разными плагинами, ссылающимися на разные версии одной и той же сборки. –

+0

Спасибо Илия за ваш ответ. Приложение не является веб-приложением. Это консольное приложение, которое будет служить сервером, и мы называем это оболочкой. Сборы не известны оболочке, а только плагинам оболочки. Эти плагины не известны оболочке, но скорее обнаружены MEF. Единственное, что склеивает оболочку и плагины, - это интерфейсы. – Bosken85

ответ

1

Альтернативой использованию зондирования является использование AppDomain.AssemblyResolve event. Всякий раз, когда .NET не может загрузить сборку, она поднимет это событие, которое позволит вам самостоятельно найти и загрузить сборку. Это может быть не самое чистое решение, но это дает вам гибкость при размещении ваших сборок в любой структуре, которая вас устраивает.

+0

Спасибо за ваш ответ! Я рассмотрю это и обновляю ответ после его проверки. – Bosken85