Копирование зависимостей DLL в Visual Studio

Как настроить проект в Visual Studio для копирования сторонних библиотек DLL, от которых зависит одна из ссылок проекта?

У меня есть основной проект приложения и DLL библиотеки классов. Основное приложение ссылается на DLL библиотеки классов, а сама DLL ссылается на некоторые сторонние библиотеки DLL. Когда я компилирую основное приложение, оно автоматически копирует DLL библиотеки классов в свой выходной каталог, но не копирует сторонние DLL.

Я не хочу добавлять ссылки на сторонние библиотеки DLL из основного проекта приложения, поскольку основное приложение не использует их, они используются только библиотекой классов.

 Otávio Décio25 июн. 2009 г., 15:30
Создайте событие после сборки, которое копирует DLL, вам не нужно создавать проект только для этого.
 M. Dudley25 июн. 2009 г., 15:48
Этот метод позволяет мне хранить фактические зависимости основного приложения отдельно от зависимостей библиотеки классов. Жаль, что нет автоматического способа (который не вводит ссылки psuedo в основное приложение).

Ответы на вопрос(8)

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

 31 мар. 2010 г., 11:00
мы обнаружили, что выполнение задачи до или после сборки было единственным способом сделать это.

чтобы мои файлы зависимостей находились в корневой папке проекта, но во вложенной папке. Но файлы должны быть помещены в корневую папку в папке сборки.

Мои события сборки выглядят так:

enter image description here

enter image description here

enter image description here

 Command: call xcopy /S /Y "$(SolutionDir)Dependencies\*.*" "$(TargetDir)"

В случае & quot; Зависимости & quot; также содержит подпапки, как у меня.

личеству копируемых сборок (и, возможно, перестраиваемых). По возможности все ваши проекты должны размещать свои сборки в одном и том же $ (OutDir). Если вы используете TFS, Team Build сделает это за вас.

 M. Dudley25 июн. 2009 г., 18:43
На самом деле все наши сборки размещены в одном каталоге. Мое основное приложение ссылается на них там, и при сборке оно автоматически копирует их из этого каталога в bin / Debug. Я хотел найти способ для зависимостей & apos; зависимости, которые будут скопированы.

http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html Это сработало для меня очень хорошо - сценарий, в котором явно использовались библиотеки DevExpress, имел другие зависимости, которые вызывали проблемы при развертывании)

Note 1: Visual studio 2010 seems add referenced dlls automatically, however msbuild didn't. So Alex's solution worked since the release scripts used msbuild. Note 2: Also had to make sure that for the referenced libraries (those which were referenced in code) copy-local was actually set to True in the csproj, even though the Solution Explorer said it was. The best way is to set copy-local = False, Save, set copy-local = True, Save.

Эти два шага - copy-local = true для ссылочных библиотек и добавление целей msbuild для косвенных ссылок автоматизировали настройку сборки для меня.

 17 июн. 2014 г., 04:28
Файл больше не доступен в этом сообщении

<Project>
  ...
  <ItemGroup>
    <Content Include="Path\to\dll\dllname.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  ...
</Project>

Это работает для C #. Для родного C ++ он все еще копирует dll в выходную папку, но эта зависимость не видна в Visual Studio, ее следует редактировать непосредственно в файле проекта.

Для тестирования на нетривиальном примере Я пытался запустить C # проект A, который зависит от нативного C ++ проекта B. B проекты зависят от нативной dll C третьей стороны - эта зависимость реализована с помощью фрагмента выше в файле проекта. Когда я собираю A, C копируется в двоичную папку.

Я попробовал это в Visual Studio 2010.

 22 апр. 2016 г., 09:57
Вы должны добавить<Link>%(Filename)%(Extension)</Link> внутри<Content> чтобы избежать создания всей структуры каталогов и только копировать файлы.
 12 сент. 2014 г., 12:45
это копирует всю структуру каталогов в bin. как bin \ Path \ to \ dll \ dllname.dll Он хочет иметь bin \ dllname.dll
 17 янв. 2018 г., 01:33
В соответствии сMSDN Вы можете добавить дополнительный атрибутVisible=true чтобы содержимое отображалось в обозревателе решений. например<Content Visible="true" Include="..."
 04 нояб. 2013 г., 12:39
Вот как я копируюsingle файл. dllname.dll - это файл, а не папка
 17 янв. 2018 г., 01:36
Также,<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> будет копировать только если новее, а не в каждой сборке.
Решение Вопроса

позволяет определять события, происходящие до или после сборки. Чтобы попасть в окно свойств проекта, просто щелкните правой кнопкой мыши свой проект в окне обозревателя решений и выберите «свойства». С левой стороны перейдите к пункту «Построить события». Вкладка.

В поле после сборки введите несколько команд копирования. Например:

copy "$(SolutionDir)mydll.dll" "$(TargetDir)"

куда$(SolutionDir) а также$(TargetDir) обе предопределенные переменные. Стандартный синтаксис выглядит следующим образом:

copy "source directory and file name" "destination directory"

Если вы нажмете на кнопку "Редактировать пост-сборку ..." Кнопка это вызовет окно, в котором есть список этих предопределенных переменных, которые вы можете вставить (например,$(SolutionDir) а также$(TargetDir))

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

 08 мая 2014 г., 17:16
У меня точно такой же сценарий, что и у OP, но основной проект приложения не копируетcopyd .dll файлы.
 10 окт. 2013 г., 16:24
Может ли копия содержать символы подстановки, как в копии SOME_DIRECTORY * .dll $ (TargetDir)?
 24 июл. 2017 г., 11:09
Для чего нужны цитаты? Это работает только для меня при удалении кавычек (VS2017).

ссылки, ссылки на вашу библиотеку классов.

Установите & quot; Копировать локальный & quot; к Истине.

Теперь он скопирует каталог bin вашей библиотеки классов в основной каталог bin приложения. Включая любые субзависимости сторонних dll.

 11 мая 2015 г., 19:48
Это не сработало для меня.
 03 авг. 2016 г., 16:10
Это скопирует стороннюю библиотеку в каталог bin библиотеки классов, но не в конечный выходной каталог

100% уверен, что это будет работать.. файл

<Reference Include="Xceed.Wpf.Toolkit">
  <HintPath>..\..\..\3rdParty\Extended WPF Toolkit-2.2.1\Xceed.Wpf.Toolkit.dll</HintPath>
   <CopyToOutputDirectory>Always</CopyToOutputDirectory>   
   <SpecificVersion>False</SpecificVersion> 
</Reference>

<Content Include="..\..\..\3rdParty\Extended WPF Toolkit-2.2.1\Xceed.Wpf.Toolkit.dll">
  <Link>Xceed.Wpf.Toolkit.dll</Link>
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  <SpecificVersion>False</SpecificVersion>
</Content>

Ваш ответ на вопрос