【发布时间】:2019-11-20 13:38:59
【问题描述】:
我正在使用 [DllImport] 在 .NET Core 中编写依赖本机代码的应用程序。我有用于 win-x64、win-x86 和 linux-x64 的本机编译库工件。
我的项目结构是这样的:
MyApp
|--Main.cs
|--runtimes
|--win-x86
|--native
|--somelibrary.dll
|--win-x64
|--native
|--somelibrary.dll
|--linux-x64
|--native
|--libsomelibrary.so
当我运行应用程序时,我得到了 DLL not found 异常。
我曾尝试使用 MSBuild 目标解决方案 here,但这只会在编译时将一个 dll 复制到主输出文件夹。但是,我希望输出包含与上述运行时文件夹相同结构的输出文件夹中的所有三个本机库,并将兼容本机库的选择留给 .NET Core 运行时主机。
所以如果用户在 Windows x86 中运行应用程序,它将使用 win-x86,依此类推。
我注意到,当我从 NuGet 引用像 SkiaSharp 这样的原生包装器时,它实际上会很好地集成到我的应用程序中,并且会将所有资产包含在运行时文件夹结构中,以便在运行时在多个环境中工作。我该怎么做?
编辑:
我最终为本地库绑定创建了一个 nuget 包,并在我的其他项目中引用了该 nuget。
【问题讨论】:
-
@vassalware 嗨,这似乎是设计的方式。 NuGet 包处理和 msbuild 项目引用不一样。见这里:github.com/dotnet/sdk/issues/8645 和:github.com/NuGet/Home/issues/8623
-
也许你可以从一个类似的项目中得到一些线索:github.com/BrannonKing/NLoptNet。自从我开始研究它已经有一段时间了,所以我无法解释它。
标签: .net-core cross-platform native