Как предотвратить загрузку / ссылку на приложение.NET из сборки из GAC?
Можно ли настроить приложение.NET таким образом (параметры в Visual Studio), чтобы оно ссылалось на "локальную" сборку (не в GAC) вместо сборки в GAC, хотя обе сборки имеют одинаковое имя и одинаковую версию?
4 ответа
Если обе сборки имеют строгое имя (подписано), CLR всегда будет загружаться из GAC.
Вот шаги, которые среда выполнения использует для разрешения ссылок на сборки (из статьи Как среда выполнения находит сборки):
Определяет правильную версию сборки, изучая соответствующие файлы конфигурации, включая файл конфигурации приложения, файл политики издателя и файл конфигурации компьютера. Если файл конфигурации находится на удаленном компьютере, среда выполнения должна сначала найти и загрузить файл конфигурации приложения.
Проверяет, было ли ранее связано имя сборки, и, если да, использует ли ранее загруженную сборку. Если предыдущий запрос на загрузку сборки не удался, запрос сразу же завершился неудачей без попытки загрузить сборку.
Проверяет глобальный кеш сборок. Если сборка найдена там, среда выполнения использует эту сборку.
Зонды для сборки (... некоторые материалы опущены...)
Как сказано позже в той же статье:
Не проводится проверка версий для сборок без строгих имен, а также проверка времени выполнения в глобальном кэше сборок для сборок без строгих имен.
Так что, если вы можете позволить себе удалить подпись из локальной сборки, приложение будет использовать ее вместо той, что в GAC.
Более подробную информацию о механизмах привязки во время выполнения, чем вы, возможно, захотите, см. В блоге Сюзанны Кук.
Эта запись в блоге Скотта Хансельмана также предоставляет отличный обзор процесса переплета.
Вы видели этот ответ?
Принудительное приложение ASP.NET для загрузки сборки из bin, а не из GAC
Похоже, вы пытаетесь сделать то же самое.
Вы можете использовать ilmerge и объединить сборки в одну библиотеку, чтобы обойти это.
Если вы можете изменить номер версии локальной библиотеки DLL, вы можете использовать перенаправление версии DLL, используя атрибут oldVersion. Вы можете использовать строгое имя для локальной сборки: посмотрите эту страницу: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx
Также следует учитывать, что можно изменить номер версии скомпилированной сборки, как описано здесь: Изменить версию сборки в скомпилированной сборке.NET
Для успешного развертывания приложения.NET Framework вы должны понимать, как общеязыковая среда выполнения находит и привязывает сборки, составляющие ваше приложение. По умолчанию среда выполнения пытается связать с точной версией сборки, с которой было создано приложение. Это поведение по умолчанию может быть изменено настройками файла конфигурации.
Информацию о привязке можно просмотреть в файле журнала с помощью средства просмотра журнала привязки сборки (Fuslogvw.exe), которое входит в комплект разработчика программного обеспечения Windows (SDK).
s