Мы реализуем платформу плагинов для нашего приложения и загружаем сборки плагинов с помощью Assembly.Loadfrom. Затем мы используем GetTypes() и дополнительно изучаем типы с каждым файлом плагина для поддерживаемых интерфейсов.
Путь к плагинам предоставляется пользователем, и мы просматриваем каждый из файлов в папке, чтобы увидеть, поддерживает ли он (плагин) наш интерфейс плагина. Если это так, мы создаем экземпляр, если мы не перейдем к следующему файлу.
Мы создаем две версии программного обеспечения из одной базы кода (appA_1 и appA_2).
Загрузка плагинов хорошо работает, когда плагины загружаются приложением, которое было создано одновременно с файлом плагина. Однако, если мы создадим appA_2 и укажем на папку плагина appA_1, мы получим исключение, когда вызывается GetTypes().
Базовая версия нашего кода:
var pluginAssembly = Assembly.LoadFrom(FileName);
foreach (var pluginType in pluginAssembly.GetTypes())
{
Мы получаем исключение "ReflectionTypeLoadException".
Это связано с тем, что мы хотим, чтобы наше приложение могло загружать типы любого плагина, созданного кем-либо. Что-то нам не хватает?
EDIT: После итерации через LoaderExceptions мы обнаружили, что существует один файл libPublic.dll, который генерирует исключение System.IO.FileNotFoundException. Странно, что этот файл находится в каталоге приложения, а плагин ссылается на файл проекта.
ИЗМЕНИТЬ 2: В журнале исключений мы находим следующее "Сравнение названия сборки привело к несоответствию: номер версии"