Я пишу код для реализации архитектуры подключаемого модуля. Я определил интерфейс, назовем его IThing
в пространстве имен MyStuff
, для плагина, и у меня также есть код для динамического создания экземпляра подключаемого модуля из DLL. Мой код делает это, просматривая обнажает классы, поля и методы, и в конечном итоге тестирования, что он находит с:Когда .Net-интерфейсы считаются эквивалентными?
if (typeof(IThing).IsAssignableFrom(instType))
Это все хорошо и хорошо работает, когда интерфейс реализуется что-то в моем собственном коде, то есть ссылки на сборка, которая обеспечивает определение MyStuff.IThing
.
Другой разработчик, в другой компании, расположенной в другой стране, пишет подключаемый компонент.
Я отправил определение интерфейса, то есть источник C#, для MyStuff.IThing
разработчику, и он включил его в свой код.
Проблема, которую мы увидели в первую очередь, заключается в том, что его компонент, хотя он реализовал MyStuff.IThing
, не прошел бы вышеописанный тест IsAssignableFrom
. Причина неудачи заключается в том, что он имеет определение интерфейса в другой сборке (естественно), хотя он имеет одно и то же пространство имен и определение интерфейса не изменилось. Решение здесь достаточно простое, что я посылаю ему сборку DLL, содержащую интерфейс.
Мой вопрос заключается в следующем: учитывая, что пространство имен совпадает и определение интерфейса идентично, почему важно, какая сборка находится в нем? Если сборка A содержит MyStuff.IThing
с точно таким же определением интерфейса, как MyStuff.IThing
в сборке B, почему эти сборки не взаимозаменяемы для приложений, которые хотят работать с экземпляром MyStuff.IThing
?
Это важно, потому что имя сборки является частью идентификатора типа. –