Сценарий: я использую 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, по-прежнему импортировались.
Есть ли способ добиться этого? Я думаю об одном из нескольких возможных вариантов:
атрибут Ideas?