Сценарий: я использую Managed Extensibility Framework для загрузки плагинов (экспорт) во время выполнения на основе контракта интерфейса, определенного в отдельной DLL.В моем решении Visual Studio у меня есть 3 различных проекта: хост-приложение, библиотека классов (определяющая интерфейс - «IPlugin») и другая библиотека классов, реализующая интерфейс (экспорт - «MyPlugin.dll»).
Хост ищет экспорт в своем собственном корневом каталоге, поэтому во время тестирования я собираю все решение и копирую Plugin.dll из папки bin / release библиотеки классов Plugin в каталог отладки хоста, чтобы его нашел каталог DirectoryCatalog ииметь возможность добавить его в CompositionContainer.Plugin.dll не копируется автоматически после каждой перестройки, поэтому я делаю это вручную каждый раз, когда вносю изменения в контракт / реализацию.
Однако пару раз я запускал хост-приложение, не имеяСначала скопировал (обновленный) Plugin.dll, и во время композиции возникла исключительная ситуация:
Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information
Это, конечно, из-за того, что Plugin.dll пытаетсяимпорт из реализует другую версию IPlugin, где сигнатуры свойств / методов не совпадают.Хотя этого легко избежать в контролируемой и контролируемой среде, просто избегая (скучно) устаревших реализаций IPlugin в папке плагинов, я не могу полагаться на такие предположения в производственной среде, где могут встречаться устаревшие плагины.
Проблема в том, что это исключение эффективно запускает все действие Compose и no export импортируется.Я бы предпочел, чтобы несоответствующие реализации IPlugin просто игнорировались, поэтому другие экспорты в каталог (ы), реализующие правильную версию IPlugin, все еще импортируются.
Есть ли способ сделать это?Я думаю, один из нескольких возможных вариантов:
- Существует флаг для CompositionContainer («игнорировать неудачные импорты») до или при вызове Compose
- Существуетаналогичный флаг, который указывается для атрибута
<ImportMany()>
- . Существует способ "привязать" к процессу итерации, лежащему в основе Compose (), и иметь возможность обрабатывать каждый (неудачный) импорт по отдельности
- Использование строгой подписи для того, чтобы как-то только искать импорт, реализующий текущую версию IPlugin
Идеи?