У меня есть сборка A, которая зависит (статически) от типа T (ссылочный тип, класс) в сборке B.
У меня нет сборки A, но у меня есть собственная сборка B. T, к сожалению, является реальным типом (не интерфейсом), но, к счастью, A использует отражение для обнаружения своих членов.
Я хочу иметь возможность динамически создавать B (и T). Единственный важный момент заключается в том, что я должен быть уверен, что динамически созданные «B и T» (не их члены) являются «эквивалентными» тем, которые были статически скомпилированы при компиляции A.
- Я могу использовать отражение 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).
ПРИМЕЧАНИЕ. Предположим, что сборки не подписаны.