Почему сборка ссылок веб-сайта ASP.NET из GAC при добавлении локальной ссылки?
Когда вы используете веб-сайт ASP.NET(вместо модели веб-приложения) и добавляете ссылку на сборку из локальной папки, Visual Studio, похоже, понимает, что эта локальная сборка также находится в GAC и поэтому не копирует эту сборку в папку bin (как и с не-GAC-ассамблями), но просто добавляет новую запись в файл web.config.
Почему такое поведение? Можно ли принудительно копировать в папку bin (мне это нужно, поскольку .dll не находится в целевой среде)? Я могу добавить сборку в папку bin в качестве файла, и она будет работать, но в этом случае содержимое папки bin будет в исходном управлении, что плохо.
Ответы
Ответ 1
Вы можете установить для свойства Copy Local значение True в ссылке. Это должно добавить его в папку bin - в проекте веб-приложения.
Но для проекта веб-сайта при добавлении ссылки все, что он делает, это добавить строку в файл web.config, ссылающийся на сборку. Он будет искать этот файл сначала в папке bin, а затем в GAC, если он не найден.
У вас есть два варианта: требуется, чтобы сборка была установлена в GAC на целевой машине (в этом случае развертывание XCOPY невозможно) или включать все необходимые сборки в папку bin, либо путем их копирования, либо записи post-build script, который делает это. Вы можете найти .dll с помощью командной строки и перейти в c:\windows\assembly\GAC, найти интересующую вас сборку, cd в этот каталог, а затем cd в каталог с интересующей вас версией. даст вам путь к использованию в вашей пост-сборке script. Например, для сборки Accessibility в GAC вы получите такой путь:
C:\Windows\Assembly\GAC\Accessibility\1.0.5000.0__b03f5f7f11d50a3a\Accessibility.dll
Вы говорите, что содержимое папки bin в исходном элементе управления не очень хорошо. Обычно это считается истинным для двоичных файлов, которые вы создаете, но в вашем случае у вас есть двоичные активы, которые не компилируются как часть вашего проекта. Философски, они эквивалентны изображениям: двоичные активы, не скомпилированные как часть вашего проекта. Я бы сказал, что они принадлежат источнику контроля, как и любые другие двоичные файлы, на которые опирается ваш проект. Но это личный выбор.
Ответ 2
Если вы используете проект веб-сайта в Visual Studio, и ссылка продолжает указывать его на версию GAC вместо какой-либо другой папки (например, lib), вам нужно будет создать файл xxxx.dll.refresh
в папке /bin, где xxxx - это оскорбительная dll, на которую вы ссылаетесь.
Это также разрешит проблемы с сборкой в MSBuild, где сервер ожидает, что dll будет в GAC. Файл .refresh получит файл с правильным относительным путем для правильной сборки.
Ответ 3
Во время выполнения сборки должны быть в одном из двух местоположений: путь вывода проекта или глобальный кэш сборок (см. Работа с сборками и глобальный кэш сборок). Если проект содержит ссылку на объект, который не находится в одном из этих местоположений, тогда, когда проект построен, ссылка должна быть скопирована в выходной путь проекта. Свойство CopyLocal указывает, должна ли эта копия быть сделана. Если значение истинно, ссылка копируется. Если false, ссылка не копируется.
Назначенное проектом значение CopyLocal определяется в следующем порядке:
- Если ссылка - это другой проект, называемый ссылкой на проект, то значение истинно.
- Если сборка найдена в глобальном кеше сборки, значение равно false.
- В качестве специального случая значение для ссылки mscorlib.dll неверно.
- Если сборка найдена в папке Framework SDK, значение равно false.
В противном случае значение будет истинным.
Надеюсь, что это поможет
s
Ответ 4
Информацию о том, как установить Копирование локального свойства ссылки для веб-проекта (а не веб-приложения), см. в разделе
http://msdn.microsoft.com/en-us/library/t1zz5y8c(v=VS.100).aspx