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

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

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

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

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

4b9b3361

Ответ 1

Вы можете добиться этого с помощью окна свойств проекта. Visual Studio позволяет определять события, которые должны произойти, до или после создания. Чтобы попасть в окно свойств проекта, просто щелкните правой кнопкой мыши по проекту в окне проводника решений и нажмите "Свойства". С левой стороны перейдите на вкладку "события сборки".

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

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

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

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

Если вы нажмете кнопку "edit post build...", появится окно, в котором есть список этих предопределенных переменных, которые вы можете вставить (например, $(SolutionDir) и $(TargetDir))

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

Ответ 2

Для меня работает следующий фрагмент:

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

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

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

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

Ответ 3

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

  • Примечание 1: Visual Studio 2010, похоже, автоматически добавляет ссылающиеся DLL, но msbuild этого не сделал. Таким образом, решение Alex работало с тех пор, как скрипты выпуска использовали msbuild.
  • Примечание 2: Также необходимо убедиться, что для ссылочных библиотек (те, на которые ссылались в коде) copy-local на самом деле была установлена ​​True в csproj, хотя Solution Explorer сказал, что это так. Лучший способ - установить copy-local = False, Сохранить, установить copy-local = True, Сохранить.

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

Ответ 4

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

Ответ 5

Перейдите в основное приложение, ссылки, в свою ссылку на классную библиотеку.

Установите для параметра "Копировать локальное" значение "Истина".

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

Ответ 6

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

Мои события сборки выглядят следующим образом:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

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

В случае, если "Зависимости" также содержат подпапки, как это делает мой.

Ответ 7

100% уверен, что это сработает. Просто замените dll своим личным реф. файл

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

Ответ 8

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