繁体   English   中英

带有引用位元原生 dll 的托管包装 dll 的 NuGet 包

[英]NuGet Package with managed wrapper dll that references bit-ted native dlls

需要一些帮助来制作 NuGet 包。
我们有一个 3rd 方 C# 托管 dll(称为“Managed.dll”),它以某种方式使用/引用/包装 3rd 方 x86 和 x64 本机 dll(将它们都称为“Unmanaged.dll”),具体取决于运行时机器。

只要 x86 和 x64 文件夹在同一目录中,Managed.dll 就知道如何找到合适的 Unmanaged.dll,例如:

  • 垃圾桶
    • 调试
      • 管理文件
      • x86
        • 非托管.dll
      • x64
        • 非托管.dll

我可以制作一个包,如:

    • 管理文件
    • x86
      • 非托管.dll
    • x64
      • 非托管.dll

打开包,我可以看到文件位于正确的位置,因此它们被包含在内。

我还可以手动“安装”它并且全部运行等等。但是现在我们正在尝试使用 NuGet 使 dll 更易于分发。 此外,如果我在packages.config 文件中为该包添加一行,并删除packages 文件夹,则该包将被重新拉出并且仍然可以正常工作。

但是,如果我尝试使用 NuGet 包管理器进行安装,它会在尝试查找 Unmanaged.dll 时出现问题。 PM 安装的输出是:

尝试针对项目“MyProject”收集包“MyPackage.3.0.0”的依赖信息,目标是“.NETFramework,Version=v4.5.2”
收集依赖信息需要 3.51 毫秒
尝试使用 DependencyBehavior 'Lowest' 解决包“MyPackage.3.0.0”的依赖关系
解析依赖信息耗时 0 毫秒
解决安装包“MyPackage.3.0.0”的操作
安装包“MyPackage.3.0.0”的已解决操作
从“MySource”中检索包“MyPackage3.0.0”。 将包“MyPackage.3.0.0”添加到文件夹“C:\\MyProject\\packages”
将包“MyPackage.3.0.0”添加到文件夹“C:\\MyProject\\packages”
安装失败。 滚回来...
项目“MyProject”中不存在包“MyPackage.3.0.0”
从文件夹“C:\\MyProject\\packages”中删除包“MyPackage.3.0.0”
从文件夹“C:\\MyProject\\packages”中删除包“MyPackage.3.0.0”
执行 nuget 操作需要 895.64 毫秒
安装包:无法添加对“非托管”的引用。
请确保该文件可访问,并且它是有效的程序集或 COM 组件。
在行:1 字符:1
+ Install-Package MyPackage -source MySource
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Install-Package], Exception
+ FullQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand

我尝试使用“Unmanaged.props”文件将构建目录添加到包中,但发生了相同的错误。 我试过将“Unmanaged.dll”与包中的“Managed.dll”放在同一级别。

所以,请告诉我为什么它找不到“Unmanaged.dll”(为了我自己的启发)以及我需要做什么才能让它正常工作(可能需要一些手把手来引导我完成它)。 我需要一个 .targets 吗? 自定义 install.ps1?

我正在使用 VS2015 和 NuGet 3.5

还是这样吗? 如果是这样,有人可以解释如何让这两个包一起玩吗?

这个链接似乎说托管和非托管可以在同一个包中。

谢谢

我刚刚有这个问题。 我不得不在 .nuspec 文件中添加一个引用部分,在其中我只列出了我的托管 dll。 这似乎有助于 VS 冷静下来,而不是尝试向非托管 dll 添加引用。

如果您正在重建您的包并在另一个项目中测试安装, dbrunning 的解决方案是正确的。 但是您必须清除 Visual Studio 中的 nuget 缓存,否则错误会不断发生,即使您将 nuget 推送到私有 nuget 服务器。

对于 Visual Studio 2019:

  • 菜单“工具”=>“选项”
  • 在树视图中选择节点“Nuget Package Manager”
  • 单击按钮“清除所有 NuGet 缓存”

这个按钮不会删除解决方案中的“包”文件夹,以防万一womeone 想知道……我不知道这个按钮到底是做什么的。 如果到目前为止 nuget 包安装失败,则无论如何都不需要清除包文件夹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM