Вопрос по dll, visual-studio – Копирование зависимостей DLL в Visual Studio

60

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

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

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

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

Ваш Ответ

8   ответов
-4

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

мы обнаружили, что выполнение задачи до или после сборки было единственным способом сделать это.
6

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 для косвенных ссылок автоматизировали настройку сборки для меня.

Файл больше не доступен в этом сообщении
2

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

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

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

Это не сработало для меня.
Это скопирует стороннюю библиотеку в каталог bin библиотеки классов, но не в конечный выходной каталог
2

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

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

<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.

Вот как я копируюsingle файл. dllname.dll - это файл, а не папка
В соответствии сMSDN Вы можете добавить дополнительный атрибутVisible=true чтобы содержимое отображалось в обозревателе решений. например<Content Visible="true" Include="..."
Также,<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> будет копировать только если новее, а не в каждой сборке.
Вы должны добавить<Link>%(Filename)%(Extension)</Link> внутри<Content> чтобы избежать создания всей структуры каталогов и только копировать файлы.
это копирует всю структуру каталогов в bin. как bin \ Path \ to \ dll \ dllname.dll Он хочет иметь bin \ dllname.dll
2

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

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

enter image description here

enter image description here

enter image description here

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

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

-3

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>
37

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

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

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

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

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

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

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

Для чего нужны цитаты? Это работает только для меня при удалении кавычек (VS2017).
Может ли копия содержать символы подстановки, как в копии SOME_DIRECTORY * .dll $ (TargetDir)?
У меня точно такой же сценарий, что и у OP, но основной проект приложения не копируетcopyd .dll файлы.

Похожие вопросы