Как визуальная студия определяет, что копировать в выходной каталог с многопроектными решениями?
Скажем, мы имеем решение со следующей структурой:
- 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,
Ответы
Ответ 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".
Ответ 4
@RenniePet Здесь ссылка на блог, который описывает метод RenniePet, описанный в комментарии выше (если вы не хотите редактировать файл проекта вручную, как предлагал @Shaun):
http://blogs.msdn.com/b/jjameson/archive/2009/11/18/the-copy-local-bug-in-visual-studio.aspx