Как можно приводить объекты из разных сборок друг к другу?

Я столкнулся с этой, по-видимому, довольно распространенной проблемой -

  1. У меня есть интерфейс в сборке A.

  2. Я динамически загружаю сборку B и пытаюсь передать объект из нее в свой интерфейс из сборки A.

  3. Сбой с InvalidCastException.

Я понял, почему — класс в сборке A и класс в сборке B, даже с одним и тем же именем и одним и тем же кодом, не одно и то же и не могут быть приведены друг к другу.

Мой вопрос: есть ли решение этого? Есть ли способ сделать эти два типа совместимыми, или мне нужно продублировать мой интерфейс в сборке B и привести к нему объект?

Я загружаю сборку B с помощью Assembly.LoadFrom - есть ли другой способ сделать это, чтобы сделать их совместимыми по типу?

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


person Deane    schedule 01.04.2009    source источник


Ответы (2)


Дублирование не является ответом. Может ли сборка B ссылаться на сборку A и использовать оттуда интерфейс (или что-то еще)?

Если нет, объявите интерфейс (или что-то еще) в автономной dll, на которую ссылаются как Assembly A, так и Assembly B. Тогда есть только 1 версия интерфейса, и все работает.

person Marc Gravell    schedule 01.04.2009

Вы точно можете привести тип из одной сборки к типу из другой - иначе мы бы никогда не смогли выполнить приведение из object :)

Я подозреваю, что проблема в том, что интерфейс был загружен отдельно - я подозреваю, что ваша сборка B снова загрузила сборку A (возможно, откуда-то еще?).

Как выглядит ваш макет файла? Если вы загружаете сборку B из другого каталога и в ней есть копия сборки A, возможно, она загружается оттуда. Загрузка и привязка сборки — непростое дело. Я рекомендую получить "CLR через C#" и очень внимательно прочитать главу об этом, и/или включение ведения журнала Fusion, чтобы увидеть, что происходит.

(Кстати, я предполагаю, что тип в сборке B действительно реализует интерфейс сборки A? Если нет, это объясняет!)

У меня есть довольно старая статья, которая служит своего рода учебным пособием по этому вопросу. Кстати. Это может помочь.

person Jon Skeet    schedule 01.04.2009