Как среда .NET определяет, что два типа одинаковы? - PullRequest
1 голос
/ 12 апреля 2009

У меня есть сборка A, которая зависит (статически) от типа T (ссылочный тип, класс) в сборке B.

У меня нет сборки A, но у меня есть собственная сборка B. T, к сожалению, является реальным типом (не интерфейсом), но, к счастью, A использует отражение для обнаружения своих членов.

Я хочу иметь возможность динамически создавать B (и T). Единственный важный момент заключается в том, что я должен быть уверен, что динамически созданные «B и T» (не их члены) являются «эквивалентными» тем, которые были статически скомпилированы при компиляции A.

  1. Я могу использовать отражение Emit для создания B и T. Нет проблем.
  2. Я могу записать B.dll на диск
  3. Если A был скомпилирован с этим B.dll, то я могу динамически изменить T, нет проблем
  4. Однако, если A был скомпилирован с эквивалентным (написанным от руки B и T), тогда T 'в A будет иметь такое же имя сборки и имя типа, но не будет считаться равным динамически созданному.

Я предполагаю, что причиной является свойство GUID для типа. Когда я записываю B.dll на диск, тип T имеет тот же GUID, что и тот, который я могу создать динамически (даже если я изменяю его члены). Однако «эквивалентный» рукописный тип не использует один и тот же GUID.

В итоге GUID такой же, если dll происходит из динамически созданного, но отличается от статически созданного. GUID один и тот же каждый раз (даже если я перекомпилирую). GUID такой же, если я изменяю содержимое динамического типа.

Как среда выполнения определяет, являются ли два типа одинаковыми? Как создается этот GUID? Он использует этот GUID и / или что-то еще? Можно ли назначить этот GUID в моей сборке dimamic так, чтобы он соответствовал идентификатору сборки A?

Может ли этот GUID быть проверен статически (я не смог увидеть его с помощью Reflector или ildasm).

ПРИМЕЧАНИЕ. Предположим, что сборки не подписаны.

1 Ответ

4 голосов
/ 12 апреля 2009

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

AFAIK, свойство Type.GUID используется только тогда, когда ваши типы зарегистрированы для использования COM. Работает с классом GuidAttribute. Следовательно, Type.GUID не имеет ничего общего с «идентичностью» типа.

Подробнее о том, как среда выполнения находит сборки, можно прочитать здесь: http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

...