如何在托管项目中使用本地 NuGet 包?

4
我有一个使用P/Invoke连接C语言风格的本地DLL的托管项目。
如何正确打包本地DLL,以便将其作为NuGet包添加到托管项目中,并使DLL自动复制到输出文件夹?
我目前使用CoApp创建了一个本地DLL的包,但无法从托管项目中使用它。尝试添加该包时,我遇到以下错误:
“无法安装软件包“foo.redist 1.0.0”。您正在尝试将此软件包安装到目标为“.NETFramework,Version=v4.5.1”的项目中,但该软件包不包含与该框架兼容的任何程序集引用或内容文件。有关详细信息,请联系软件包作者。”
目前,我的autopkg文件中只有这些“pivots”。
[Win32,dynamic,release] {
    bin: release\foo.dll;
}
[Win32,dynamic,debug] {
    bin: debug\foo.dll;
}

我需要添加什么其他的东西吗?


你是否曾经使用CoApp解决过这个问题? - Edenhill
1个回答

1
我处于类似的情况。我选择不使用CoApp来完成这个项目,而是创建一个新的nuspec/.targets文件组合。
在nuspec文件中,我使用元素列出我的本地dll。
在.targets文件中,您可以访问msbuild Condition属性,它允许基本的配置轴线。在我们的情况下,我们始终部署64位二进制文件,因此不需要平台轴线,但如果需要,也可以添加它。
由于二进制文件不在lib中,所以运行nuget pack时会收到警告,但除此之外它可以正常工作。
步骤:
- 在包含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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接