尝试将非 .NET 库添加到 NuGet 包

Trying to add non-.NET libraries to NuGet package

我有一个使用非 .NET DLL 的 .NET DLL。我正在尝试从中创建一个 NuGet 包,但我似乎并没有深入了解这背后的魔力。我阅读了有关 <files><references> 的 NuGet 参考资料,但这对我来说并没有真正解决 - VS 一直拒绝安装包,理由是“......未能添加对非 NETLib1”。我尝试了一种不同的变体,其中非 .NET 库与 net40 文件夹中的 .NET 库以及没有 <files> 部分的 nusepc 文件捆绑在一起,但在这种情况下,即使包安装正常,代码在运行时抛出异常,因为它找不到 DLL。

这是我的 .nuspec:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>PackageName</id>
    <version>1.0.3</version>
    <authors>me</authors>
    <owners>some guys</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>description</description>
    <references>
        <reference file="NonNETLib1.dll" />
        <reference file="NonNETLib2.dll" />
        <reference file="NonNETLib3.dll" />
    </references>
  </metadata>
    <files>
        <file src="lib\NonNETLib1.dll" />
        <file src="lib\NonNETLib2.dll" />
        <file src="lib\NonNETLib3.dll" />
    </files>
</package>

文件夹结构如下:

[lib]
  \- NonNETLib1.dll
  \- NonNETLib2.dll
  \- NonNETLib3.dll
  \- [net40]
        \- Net40Lib.dll

我在这里错过了什么?

P.S。我知道这有点相似 to this question,但公认的答案并没有多大帮助。

even though the package installed OK, the code threw an exception in runtime, because it could not find the DLLs

当您在项目中添加对 .Net DLL 的引用时,它会自动复制到输出文件夹。但是由于你的DLL不是.Net,所以你不能直接在项目中添加对它的引用,所以根本没有复制。

我会在您的项目中添加预构建或 post-构建步骤,例如 xcopy /y /f "$(ProjectDir)..\packages\NonNet.dll" "$(TargetDir)",但我怀疑有更好更简洁的方法来完成它。

无论如何,这不是与 nuget 相关的问题,而是更普遍的 Visual Studio 项目问题。


更新

似乎共识是将本机 DLL 作为现有项(作为 link)添加到项目中,如果较新,则将其设置为 content/copy:Are there any better ways to copy a native dll to the bin folder?

有一个基于 powershell 的工具集,用于打包本机代码以供 NuGet 使用。它主要处理与集成到本机项目有关的问题,但它也应该提供将本机 dll 插入 .NET 项目所需的工具。

http://coapp.org/news/2013-04-26-Announcing-CoApp-Tools-For-NuGet.html

我遇到了完全相同的问题,我用 nuget 3.3 找到了一个很好的解决方案。这样只有 .net-lib 将被引用到项目中,非 .Net lib 只会被复制到 bin 文件夹中。

<references>
   <reference file="Net.dll">
<references>

<files>
   <file src="..\bin\NonNet.dll" target="lib/452">
   <file src="..\bin\Net.dll" target="lib/452">
<files>