Dll в мусорном ведре и в gac, какой из них привык? - PullRequest
68 голосов
/ 11 июня 2009

У нас есть веб-приложение, которое развернуто на многих веб-сайтах только с изменениями в веб-интерфейсе, общая часть бэк-энда имеет свою DLL в GAC, поэтому нам нужно обновить только эту одну DLL, и все сайты получают обновление.

Есть ли способ переопределить GAC с помощью DLL в папке / bin, чтобы протестировать новые функции перед их выпуском?

Ответы [ 4 ]

79 голосов
/ 11 июня 2009

Если он имеет тот же номер версии, что и указанная DLL, GAC используется.

Если вы увеличиваете номер версии, перестраиваете веб-сайт, ссылающийся на новый номер версии, помещаете новую версию в каталог / bin, тогда будет использоваться эта DLL.

Если вы не хотите менять номер версии, вам не повезло.

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

После этого он ищет сборку в GAC, затем в любой кодовой базе , указанной , и затем проверяет различные папки файловой системы на наличие DLL. Если на каком-либо из этих шагов он находит правильную версию сборки, он останавливается.

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

11 голосов
/ 05 апреля 2011

Мне удалось переопределить GAC с помощью сборки в папке \ bin, используя элемент <codebase>.

Указав <codebase version="1.2.3.4" href="/bin/MyAssembly.dll" /> в моем файле web.config, я могу указать моему приложению использовать эту версию, а не версию, указанную в GAC.

Возможно, вы также захотите взглянуть на элемент <probing> для указания мест сборки?

2 голосов
/ 04 февраля 2010

Я думаю, что могу сказать то же самое, что и Адам Силлс, но переформулировал это для моего понимания. Благодаря моему собственному тестированию, похоже, что вот что происходит:

  • Если ваше приложение скомпилировано с версией 1.0.0.0 и 1.0.0.1 находится в GAC, вы можете пропустить .dll из вашего /bin.
  • Если ваше приложение скомпилировано с версией 1.0.0.1 и 1.0.0.0 находится в GAC, вы ДОЛЖНЫ поместить DLL в ваш / bin, чтобы игнорировать GAC. Ошибка произойдет, если версия GAC старше требуемой версии вашего приложения, если вы не включите более новую версию в свой /bin.

Надеюсь, это правильно ...

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

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

S

...