Мне удалось воспроизвести эту проблему.Рассмотрим следующее.
Предположим, что ваш проект имеет следующую структуру времени выполнения (упрощенно, конечно)
C: \ Runtime \ - это ваш основной каталог времени выполнения и имеет Host.exe
C: \ Runtime \ Library \ - этот путь содержит три библиотечные сборки
Проект exe ссылается на две сборки, определяющие интерфейс, поэтому они копируются в папку времени выполнения, но не ссылаются на сборку, содержащую CustomPlugin., поэтому он не копируется.
Что, если старая версия проекта DID ссылалась на CustomPlugin.dll и копировала старую версию в \ Runtime?Затем вы разделили их.Новая версия больше не копируется, но старая версия остается.
Таким образом, когда вы создаете класс в AppDomain из \ Library, все в порядке, но при маршалинге через границу AppDomain первичный AppDomain нуждаетсязагрузить соответствующую сборку, чтобы получить информацию о типе.Сначала он находит старую версию.Если старая версия не реализует ICustomConfig, то приведение не будет выполнено.Ранее вы упоминали, что они не подписаны, поэтому .NET не будет иметь проблем с совершением этой ошибки за вас!
Таким образом, ваш каталог времени выполнения содержит
Host.exe
BaseSDK.dll
CustomPlugin.Definition.dll
CustomPlugin.dll - старая версия, не поддерживающая ICustomPlugin
, а каталог вашей библиотеки содержит
BaseSDK.dll
CustomPlugin.Definition.dll
CustomPlugin.dll - новая версия
РЕДАКТИРОВАТЬ
Вы всегда можете проверить значение plugin.GetType (). Assembly.Location, чтобы увидеть, какую DLL он загружает в каждом AppDomain.