Сохраняется ли версия зависимых сборок в ссылающейся сборке? - PullRequest
1 голос
/ 14 сентября 2011

Следующее высказывание цитируется из этой статьи в MSDN.

... подпись со строгим именем усложняет обслуживание. Под При текущей политике управления версиями сборка всегда будет пытаться загрузить точная версия сборки, против которой он был построен. Если, например, ваше приложение было построено с версией 1.0.0.0 со строгим именем сборка и вы исправляете ошибку в сборке, натыкаясь на номер версии до 1.0.0.1, существующее приложение не найдет обновленное сборка.

Теперь предположим, что существуют две сборки со строгим именем (написанные на C # или VB.net), а именно X и Y, и X зависит от Y.

  1. Сохраняется ли версия Y где-нибудь в X во время компиляции?
  2. Сохраняется ли открытый ключ, используемый в Y, где-то в X, чтобы избежать кода сменить атаку?
  3. Если версия Y проверяется, когда CLR загружает ее, что произойдет, если Y загружается динамически и нет ссылок на время компиляции?

Пожалуйста, публикуйте ссылки в своих ответах, если это возможно.

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

1 Сохраняется ли версия Y где-нибудь в X во время компиляции?

Да, каждая сборка содержит «манифест», в котором записывается собственный идентификатор и идентификатор ссылок.

2 Сохраняется ли открытый ключ, используемый в Y, где-то в X, чтобы избежать атак с изменением кода?

Да, это так

3 Если версия Y проверяется, когда CLR загружает ее, что произойдет, если Y загружается динамически и нет ссылок на время компиляции?

Обычно это не проверяется, но см. AssemblyName

2 голосов
/ 14 сентября 2011

Вы можете ссылаться на сборку со строгим именем во время компиляции или во время выполнения.

Время компиляции:

Когда вы используете ссылки во время компиляции, компилятор автоматически получает открытый ключ целевой сборки со строгим именем и помещает его в ссылка на сборку компилируемой сборки.

Таким образом, он будет сохранен в манифесте :

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

Время выполнения:

Когда вы делаете во время выполнения ссылку на сборку со строгим именем (для Например, используя метод Assembly.Load или Assembly.GetType), вы должен использовать отображаемое имя ссылочной сборки со строгим именем. синтаксис отображаемого имени выглядит следующим образом:

<assembly name>, <version number>, <culture>, <public key token>

Очевидно, что здесь вы должны указать версию вручную во время выполнения.

См. Как: ссылаться на сборку со строгим именем

...