带有托管包装器的NuGet包,它引用了bit-ted本机dll

时间:2016-12-09 20:45:18

标签: c# c++ nuget-package

需要一些帮助制作NuGet包。
我们有一个第三方C#managed dll(称之为' Managed.dll')以某种方式使用/引用/包装第三方x86和x64本机dll(将它们称为' Unmanaged.dll' )取决于运行时机器。

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

    • 调试
      • Managed.dll
      • 86
        • Unmanaged.dll
      • 64
        • Unmanaged.dll

我可以制作一个类似的包:

  • LIB
    • Managed.dll
    • 86
      • Unmanaged.dll
    • 64
      • Unmanaged.dll

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

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

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

试图收集包裹的依赖性信息' MyPackage.3.0.0'关于项目' MyProject',定位' .NETFramework,Version = v4.5.2'
收集依赖信息需要3.51毫秒 试图解决包' MyPackage.3.0.0'的依赖关系与DependencyBehavior'最低'
解析依赖信息需要0毫秒 解决安装包' MyPackage.3.0.0'的操作 已解决的安装包' MyPackage.3.0.0'的操作 正在检索包' MyPackage3.0.0'来自' MySource'。 添加包' MyPackage.3.0.0'到文件夹' C:\ MyProject \ packages'
添加了包' MyPackage.3.0.0'到文件夹' C:\ MyProject \ packages'
安装失败。回滚...
套餐' MyPackage.3.0.0'在项目' MyProject'中不存在 删除包' MyPackage.3.0.0'来自文件夹' C:\ MyProject \ packages'
删除了包' MyPackage.3.0.0'来自文件夹' C:\ MyProject \ packages'
执行nuget动作需要895.64毫秒 安装包:无法添加对未管理的'。的引用   请确保该文件可以访问,并且它是有效的程序集或COM组件 在行:1 char:1
+ Install-Package MyPackage -source MySource
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo:未指定:(:) [Install-Package],例外
    + 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吗?如果是这样,有人可以解释如何让2个包一起玩吗?

This link似乎表示托管和非托管可以在同一个包中。

由于

2 个答案:

答案 0 :(得分:0)

我刚遇到这个问题。我必须在.nuspec文件中添加references section,其中我只列出了我的托管dll' s。这似乎有助于VS放松,而不是尝试将ref添加到非托管dll。

答案 1 :(得分:0)

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

对于 Visual Studio 2019:

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

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