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



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



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



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

908   8  

8 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

перейти к главному приложению, ссылки, на ваш класс-библиотека ссылка.

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

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

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

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

enter image description here

enter image description here

enter image description here

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

в случае, если "зависимости" также содержит вложенные папки, как и мой.

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

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

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

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

Comments

    Ничего не найдено.