Как .СРЕДА выполнения NET определяет, что два типа одинаковы?

StackOverflow https://stackoverflow.com/questions/742053

Вопрос

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

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

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

  1. Я могу использовать reflection 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).

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top