如何使用NuGet和MSBuild目标将非托管依赖项复制到另一个项目中?

时间:2018-05-11 20:01:00

标签: c# msbuild nuget

我有一个带有服务库和控制台应用程序的WCF项目,用于自托管。服务应用程序需要托管和非托管库,我根据此SO答案使用NuGet包含Where to place dlls for unmanaged libraries?

在独立测试库时,此工作正常 - 所有库都正确复制到服务库输出文件夹。但是,在构建控制台应用程序时,非托管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 :(得分:0)

它适用于服务库,因为.targets文件正被导入到项目文件中,并且正在执行复制命令。如果您在控制台应用程序中需要它们,您可以:

  1. 在控制台应用
  2. 中添加对nuget包的引用
  3. 添加将文件从服务库复制到控制台应用程序的后期构建步骤
  4. 在Console App项目文件中添加自定义MSBuild步骤以执行复制。
  5. 在这三个选项中,最容易实现的是添加后期构建步骤。这可以通过打开项目属性,选择构建事件选项卡并添加如下内容来完成:

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