Как .СРЕДА выполнения NET определяет, что два типа одинаковы?
-
09-09-2019 - |
Вопрос
У меня есть сборка A, которая зависит (статически) от типа T (ссылочный тип, класс a) в сборке B.
Я не владею сборкой A, но у меня есть сборка B.T, к сожалению, является реальным типом (не интерфейсом), но, к счастью, A использует отражение для обнаружения своих членов.
Я хочу иметь возможность динамически создавать B (и T).Единственный важный пункт заключается в том, что мне нужно быть уверенным, что динамически созданные "B и T" (а не их члены) "эквивалентны" тем, которые были статически скомпилированы при компиляции A .
- Я могу использовать reflection Emit для создания B и T.Никаких проблем.
- Я могу записать B.dll на диск
- Если A был скомпилирован против этого B.dll тогда я могу динамически изменять T, без проблем
- Однако, если 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