Копирование зависимостей DLL в Visual Studio
Как настроить проект в Visual Studio для копирования сторонних библиотек DLL, от которых зависит одна из ссылок проекта?
У меня есть основной проект приложения и библиотека классов DLL. Основное приложение ссылается на библиотеку классов DLL, а сама DLL ссылается на некоторые сторонние библиотеки DLL. Когда я компилирую основное приложение, оно автоматически копирует библиотеку классов DLL в свой выходной каталог, но не копирует сторонние библиотеки DLL.
У меня нет требуется добавить ссылки на сторонние библиотеки DLL из проекта основного приложения, поскольку основное приложение не использует их, они используются только библиотекой классов.
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.
мои события сборки выглядят так:
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