【问题标题】:NuGet Package with managed wrapper dll that references bit-ted native dlls带有托管包装 dll 的 NuGet 包,该 dll 引用了位本机 dll
【发布时间】:2017-04-25 09:58:24
【问题描述】:

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

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

    • 调试
      • Managed.dll
      • x86
        • Unmanaged.dll
      • x64
        • Unmanaged.dll

我可以制作这样的包:

    • Managed.dll
    • x86
      • Unmanaged.dll
    • x64
      • Unmanaged.dll

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

我也可以手动“安装”它,方法是将包放在包目录中,添加对 Managed.dll 的引用到 csproj,然后预构建事件将位目录和 dll 复制到适当的位置,当项目已构建并且它全部运行等等。但是现在我们正在尝试使用 NuGet 使 dll 更容易分发。此外,如果我在 packages.config 文件中为包添加一行,并删除包文件夹,则重新拉取包,它仍然可以正常工作。

但是,如果我尝试使用 NuGet 包管理器进行安装,它会试图找到 Unmanaged.dll。 PM 安装的输出是:

尝试针对项目“MyProject”收集包“MyPackage.3.0.0”的依赖关系信息,目标是“.NETFramework,Version=v4.5.2”
收集依赖信息需要 3.51 毫秒
尝试使用 DependencyBehavior“最低”解决包“MyPackage.3.0.0”的依赖关系
解析依赖信息耗时 0 ms
解决安装包“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 组件。
在 line:1 char:1
+ 安装包 MyPackage -source MySource
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [安装包],异常
+ FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand

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

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

我正在使用 VS2015 和 NuGet 3.5

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

This link 好像说托管和非托管可以在同一个包里。

谢谢

【问题讨论】:

    标签: c# c++ nuget-package


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      对于 Visual Studio 2019:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 2011-04-27
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多