如何使用托管项目中的本机NuGet包?

时间:2015-03-05 10:19:36

标签: nuget nuget-package

我有一个托管项目,它通过P / Invoke使用C风格的本机DLL。

打包本机DLL的正确方法是什么,以便将其作为NuGet包添加到托管项目,并将DLL自动复制到输出文件夹?

我目前使用CoApp为本机DLL创建了一个包,但我不能在托管项目中使用它;尝试添加包时出现以下错误:

  

无法安装软件包'foo.redist 1.0.0'。你正试图   将此包安装到目标项目中   '.NETFramework,Version = v4.5.1',但包中不包含任何内容   程序集引用或与之兼容的内容文件   框架。有关更多信息,请与软件包作者联系。

目前我在autopkg文件中只有这些“枢轴”:

[Win32,dynamic,release] {
    bin: release\foo.dll;
}
[Win32,dynamic,debug] {
    bin: debug\foo.dll;
}

...我还需要添加其他内容吗?

1 个答案:

答案 0 :(得分:1)

我处于类似情况。我选择不在此项目中使用CoApp,而是创建一个新的nuspec / .targets文件组合。

在nuspec文件中,我使用<files>元素列出我的本机dll。

在.targets文件中,您可以访问msbuild Condition属性,该属性允许基本的Configuration pivoting。在我们的例子中,我们总是部署64位二进制文​​件,因此不需要Platform pivot,但如果需要,您也可以添加它。

运行nuget pack时会收到警告,因为二进制文件不在lib中,但是它可以正常工作。

步骤:

  • 在包含vcxproj的文件夹中运行nuget spec
  • 创建一个.build文件夹,在该文件夹中创建一个空的mydll.targets文件(与nuspec文件名匹配)
  • 手动填充文件,类似于以下示例;

示例mydll.nuspec:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
  ...your metadata here
</metadata>
<files>
  <file src="x64\Release\my.dll" target="x64\Release\my.dll" />
  <file src="x64\Debug\my.dll" target="x64\Debug\my.dll" />
</files>
</package>

示例mydll.targets:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)\..\x64\Release\my.dll" Condition="'$(Configuration)'=='Release'">
  <Link>my.dll</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="$(MSBuildThisFileDirectory)\..\x64\Debug\my.dll"  Condition="'$(Configuration)'=='Debug'">
  <Link>my.dll</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>