2013-10-02 1 views
2

Я пытаюсь использовать поставляемую DLL, загружающую одну и ту же зависимую DLL из двух разных мест.Исключение между объектами, загружаемыми из одной и той же сборки в разных местах

В развертывании поставщика два места сжимаются, но не у меня.

Когда код работает у меня есть исключение в класс В ролях:

Unable to cast [A]Type to [B]Type 

ошибка является тем же произошло с ор в StackOverflow вопрос Different location of assemblies stoped the type casting.

Эти два типа одного типа загружены из двух разных мест в DLL (тот же физический файл, скопированный в два каталога).

Я пытался использовать сильное имя с сигнатурой двойной библиотеки DLL, но это не сработало.

Есть ли способ, которым я могу сказать CLR, чтобы рассматривать два типа одного типа?

+1

Вы можете загрузить DLL с той же точки? –

ответ

1

Я уверен, что это запрещено по многим причинам.

Прежде всего, допустим, у вас есть 2 сборки. Первый определяет Animal и имеет потомка Dog. Второй определяет Animal. Обе сборки используют одно и то же пространство имен.

Во время выполнения, что происходит, когда вы объявляете var B = new Dog();? Должен ли код заменять версию «Анимал» второй сборки там или нет?

Что делать, если вы заявляете var A = new Animal();? IMHO, код должен просто взорваться, чтобы предотвратить его.

С точки зрения безопасности вы абсолютно не хотите, чтобы кто-то просто связывался в другой сборке, которая определяет то же пространство имен, что и ваша библиотека, для замены определенного класса.

Точка - это связывание с физическими сборками, содержащими те же самые типы, которые вы представляете огромную проблему, которая не существует для реального решения. Измените свой код так же, как и поставщик.

+0

Ваш ответ верный. Я надеялся, что для этого есть взлома, но в принципе лучше, если нет. Мой код в архитектуре отличается от кода поставщика: код поставщика работает в приложении WinForm (exe и dll все в одном каталоге); Я пытался использовать DLL для публикации службы Wcf (exe и dll-файлы Wcf не в том же каталоге). –