Как использовать цели NuGet и MSBuild для копирования неуправляемых зависимостей в другой проект? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть проект WCF с библиотекой служб и консольным приложением для самостоятельного размещения. Для приложения-службы требуются управляемые и неуправляемые библиотеки, которые я включаю, используя NuGet на основе этого ответа SO, Где разместить dll для неуправляемых библиотек?

Это прекрасно работает при независимом тестировании библиотеки - все библиотеки правильно копируются в выходную папку библиотеки служб. Однако при сборке консольного приложения неуправляемая dll не копируется в выходную папку консольного приложения и происходит сбой приложения во время выполнения.

Вопрос : Как я могу получить неуправляемую DLL, которая будет поднята / скопирована в любое приложение, в котором размещена библиотека сервиса? Я знаю, что могу сделать это вручную, но мне бы хотелось автоматизированное решение, так как я, по крайней мере, добавлю хостинг IIS и не хочу рисковать, забывая копировать каждый раз при сборке.

Вот мой файл .nuspec:

<?xml version="1.0"?>
<package>
  <metadata>
    <id>XyzLibrary</id>     
    <version>1.0.0</version>    
    <authors>Authors</authors>  
    <description>Description</description>  
    <releaseNotes>Notes</releaseNotes>  
  </metadata> 
    <files>
      <file src="XyzLibraryNet.dll" target="lib\net461\"/>
      <file src="XyzLibrary.dll" target="unmanaged"/>
      <file src="build\XyzLibrary.targets" target="build" />
    </files>    
</package>

А вот и файл .targets:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
 <Target Name="CopyMyPackageFiles" AfterTargets="AfterBuild"> 
    <ItemGroup> 
        <MyPackageFiles Include="$(MSBuildProjectDirectory)..\unmanaged\*.*"/> 
    </ItemGroup> 
    <Copy SourceFiles="@(MyPackageFiles)" DestinationFolder="$(OutputPath)">
    </Copy> 
 </Target> 
</Project>

1 Ответ

0 голосов
/ 12 мая 2018

Это работает для сервисной библиотеки, поскольку файл .targets импортируется в файл проекта и выполняется команда Копировать.Если они вам нужны в консольном приложении, вы можете:

  1. Добавить ссылку на пакет nuget в консольном приложении
  2. Добавить шаг после сборки, который копирует файлы из библиотеки службв консольное приложение
  3. Добавьте пользовательский шаг MSBuild в файл проекта Консольного приложения для выполнения копирования.

Из трех вариантов проще всего было бы добавить сообщениешаг строительства.Это можно сделать, открыв свойства проекта, выбрав вкладку событий сборки и добавив что-то вроде:

copy ..\ServiceLibrary\bin\$(Configuration)\*.dll $(OutputPath)
...