MEF: «Невозможно загрузить один или несколько запрошенных типов. Получите LoaderExceptions для получения дополнительной информации »

Сценарий: я использую Managed Extensibility Framework для загрузки подключаемых модулей (экспорта) во время выполнения на основе контракта интерфейса, определенного в отдельной dll. В моем решении Visual Studio у меня есть 3 разных проекта: хост-приложение, библиотека классов (определяющая интерфейс - «IPlugin» ) и другую библиотеку классов, реализующую интерфейс (экспорт - «MyPlugin.dll»).

Хост ищет экспорт в своем собственном корневом каталоге, поэтому во время тестирования я собираю все решение и копирую Plugin.dll из подключаемого модуля. Папка bin / release библиотеки классов в каталог отладки хоста, чтобы DirectoryCatalog хоста нашел ее и смог добавить в CompositionContainer. Plugin.dll не копируется автоматически после каждой перекомпоновки, поэтому я делаю это вручную каждый раз, когда вносил изменения в контракт / реализацию.

Однако пару раз я запускал хост-приложение без копирования ( обновлено) Сначала Plugin.dll, и во время компоновки возникла исключительная ситуация:

Невозможно загрузить один или несколько запрошенных типов. Получите LoaderExceptions для получения дополнительной информации

Это, конечно, связано с тем, что Plugin.dll, из которого он пытается импортировать, реализует другую версию IPlugin, где сигнатуры свойств / методов не совпадают . Хотя этого легко избежать в контролируемой и контролируемой среде, просто избегая (черт возьми) устаревших реализаций IPlugin в папке плагинов, я не могу полагаться на такие предположения в производственной среде, где могут встречаться устаревшие плагины.

Проблема заключается в том, что это исключение эффективно сбивает все действие Compose, и экспорт не импортируется. Я бы предпочел, чтобы несоответствующие реализации IPlugin просто игнорировались, чтобы другие экспорты в каталогах, реализующие правильную версию IPlugin, по-прежнему импортировались.

Есть ли способ добиться этого? Я думаю об одном из нескольких возможных вариантов:

  • Есть флаг, который нужно установить для CompositionContainer («игнорировать неудачный импорт») до или при вызове Compose
  • Аналогичный флаг можно указать в атрибут
  • Существует способ «подключиться» к итерационному процессу, лежащему в основе Compose (), и иметь возможность обрабатывать каждый (неудачный) импорт индивидуально
  • Использование строгой подписи имени для каким-то образом искать только импорт, реализующий текущую версию IPlugin

Ideas?

19
задан Chris Snow 31 December 2016 в 14:14
поделиться