Как предотвратить загрузку / ссылку на приложение .NET из сборки из GAC? - PullRequest
34 голосов
/ 22 октября 2009

Можно ли настроить приложение .NET таким образом (параметры в Visual Studio), чтобы оно ссылалось на «локальную» сборку (не в GAC ) вместо сборки в GAC, хотя обе сборки имеют то же имя и та же версия?

Ответы [ 4 ]

24 голосов
/ 22 октября 2009

Если обе сборки имеют строгое имя (подписано), CLR всегда будет загружаться из GAC.

Вот шаги, которые среда выполнения использует для разрешения ссылок на сборки (из Как среда выполнения находит сборки ):

  1. Определяет правильную версию сборки путем изучения применимых файлы конфигурации, включая файл конфигурации приложения, файл политики издателя и машина конфигурационный файл. Если Файл конфигурации находится на удаленная машина, время выполнения должно найдите и скачайте приложение Сначала файл конфигурации.

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

  3. Проверяет глобальный кеш сборок. Если там находится сборка, среда выполнения использует эту сборку.

  4. Зонды для сборки (... некоторые материалы опущены ...)

Как указано далее в той же статье:

Нет проверки версий для сборок без строгих имен, а также среда выполнения проверьте в глобальном кэше сборок сборки без строгих имен.

Так что, если вы можете позволить себе удалить подпись из локальной сборки, приложение будет использовать ее вместо той, что в GAC.

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

Эта запись в блоге Скотта Хансельмана также дает отличный обзор процесса переплета.

1 голос
/ 24 сентября 2018

Вы можете использовать ilmerge и объединить сборки в одну библиотеку, чтобы обойти это.

1 голос
/ 03 июля 2013

Если вы можете изменить номер версии локальной библиотеки DLL, вы можете использовать перенаправление версии DLL, используя атрибут oldVersion. Вы можете использовать строгое имя для локальной сборки: Пожалуйста, посмотрите эту страницу: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx

Также следует учитывать, что можно изменить номер версии скомпилированной сборки, как описано здесь: Изменение версии сборки в скомпилированной сборке .NET

0 голосов
/ 29 апреля 2010

Чтобы успешно развернуть приложение .NET Framework, вы должны понимать, как общеязыковая среда выполнения находит и привязывает сборки, составляющие ваше приложение. По умолчанию среда выполнения пытается связать с точной версией сборки, с которой было создано приложение. Это поведение по умолчанию может быть изменено настройками файла конфигурации.

Информацию о привязке можно просмотреть в файле журнала с помощью средства просмотра журнала привязки сборки (Fuslogvw.exe), которое входит в комплект разработчика программного обеспечения Windows (SDK).

S

...