Как Visual Studio определить, что копировать в выходной каталог с решениями нескольких проектов?

голоса
26

Скажем, у нас есть решение со следующей структурой:

  • Project.DAL - Уровень доступа к данным, зависит от библиотеки более низкого уровня, например, Oracle.DataAccess ж / скопировать локальный = верно
  • Project.BLL - Бизнес-логика, ссылки Project.DAL как проект
  • Project.UI - UI слой, компилируется в исполняемый файл, ссылки Project.BLL, проект по умолчанию

При Project.UI компиляции VS достаточно умен, чтобы скопировать Project.DAL.dll в выходной каталог, но это не достаточно умны, чтобы понять, что я хотел Oracle.DataAccess быть скопированы в каталог вывода, а также для распределения клиентов ,

Может кто-нибудь объяснить, почему это так? Это потому, что он видит Oracle.DataAccess в GAC и предполагает, что клиенты будут иметь его в GAC, а?

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

Задан 09/12/2008 в 18:46
источник пользователем
На других языках...                            


4 ответов

голоса
27

Еще кое-что.

Когда вы не используете ссылочный DLL в коде вообще, он будет игнорировать CopyLocal и не копировать его в выходной каталог.

Ответил 14/02/2010 в 18:36
источник пользователем

голоса
25

Да, Visual Studio будет копировать DLL в выходном тракт в любом из двух указанных ниже условий:

  1. DLL ссылается явно с CopyLocal = верно
  2. DLL ссылается без CopyLocal или косвенно через какой - либо другой DLL ссылается и не в GAC

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

Я предлагаю вам создать библиотечный каталог, где вы положили все внешние узлы, на которые ссылаются. Затем настроить автоматический скрипт MSBuild на компьютере (или VM), которые не имеют Oracle-файл gac'ed (ни Visual Studio, установленный для этого имя). Таким образом, файл будет скопирован в строй, и вы будете иметь больше контроля над тем, что сделано, чем при использовании VS.

Ответил 02/02/2009 в 17:49
источник пользователем

голоса
15

У меня была странная ситуация, когда даже если сборка была ссылка проекта и ссылка на «Copy Local» отображается как «True» в окне свойств ссылок, то DLL была не копируются в выходной каталог. Я имел более раннюю версию DLL в GAC, но я не понимаю, почему это должно предотвратить DLL копирования.

Я обнаружил, что при выгрузке проекта и вручную редактировать ссылочный XML проекта следующим образом:

<ProjectReference Include="..\SomeProject.csproj">
  <Project>{11111111-1111-1111-1111-111111111111}</Project>
  <Name>Some Project Name</Name>
  <Private>True</Private>
</ProjectReference>

DLL был скопирован в каталог Ouput , как ожидалось. Я обнаружил , что просто установка Copy Local Истина в окне свойств означало <Private>элемент был полностью отсутствует, но в случае его быть установлен в ложь он присутствовал со значением «False».

Ответил 13/05/2010 в 16:47
источник пользователем

голоса
3

@RenniePet Вот ссылка на блог, который описывает метод RenniePet, описанный в указанном выше комментарии (если вы не хотите редактировать файл проекта вручную, как предложенный @Shaun):

http://blogs.msdn.com/b/jjameson/archive/2009/11/18/the-copy-local-bug-in-visual-studio.aspx

Ответил 29/11/2013 в 00:06
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more