Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

  • В DLL явно указывается CopyLocal = true
  • DLL ссылается без CopyLocal или неявно через какую-либо другую ссылочную DLL и не находится в GAC

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

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

Ответ 2

Еще одна вещь.

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

Ответ 3

У меня была странная ситуация, когда сборка была ссылкой на проект, и на нее ссылался "Скопировать локальный", показанный как "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 была скопирована в каталог вывода, как и ожидалось. Я обнаружил, что установка параметра "Копировать локальное" в "Истина" в окне свойств означает, что элемент <Private> полностью отсутствует, но в случае его установки в false он присутствовал со значением "False".