我有一个托管项目,它通过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;
}
...我还需要添加其他内容吗?
答案 0 :(得分:1)
我处于类似情况。我选择不在此项目中使用CoApp,而是创建一个新的nuspec / .targets文件组合。
在nuspec文件中,我使用<files>
元素列出我的本机dll。
在.targets文件中,您可以访问msbuild Condition属性,该属性允许基本的Configuration pivoting。在我们的例子中,我们总是部署64位二进制文件,因此不需要Platform pivot,但如果需要,您也可以添加它。
运行nuget pack时会收到警告,因为二进制文件不在lib中,但是它可以正常工作。
步骤:
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>