c# - 带有引用位 native dll 的托管包装器 dll 的 NuGet 包

标签 c# c++ nuget-package

在制作 NuGet 包时需要一些帮助。
我们有一个第 3 方 C# 托管 dll(称为“Managed.dll”),它以某种方式使用/引用/包装第 3 方 x86 和 x64 native 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 文件,并删除 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
+ 安装包 MyPackage -source MySource
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [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 ?如果是这样,有人可以解释如何让这两个包一起玩吗?

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

谢谢

最佳答案

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

关于c# - 带有引用位 native dll 的托管包装器 dll 的 NuGet 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41068607/

相关文章:

powershell - 如何在NuGet PowerShell安装中从项目中删除和删除文件夹?

c# - 扩展方法不适用于接口(interface)

c# - 使用 SSL 和 SslStream 进行点对点身份验证?

c++ - <?= 在 C++ 中是什么意思

c++ - 为什么比较 constexpr 函数的两个参数不是静态断言的常量条件?

c# - Visual Studio 上的 Nuget 包推送 403 错误

nuget - 防止在 nuspec 包文件中嵌入互操作类型

c# - 通过 javascript 调用 C# windows 服务函数

c# - 单击时突出显示 <li> 元素并在页面加载后保持突出显示

c++ - Boost.Graph:使用名称保存和加载 boost::adjacency_list