我们有一个跨平台的 C# 项目 (.net Core)。它使用 native 库 (C++),每个平台都不同。
我们知道您可以在单个 nuspec 文件中指定不同的框架,但这种情况不同:
- 将有一个 C# DLL 文件
- 会有不同的原生库(比如 a.linux.so 和 a.windows.dll)
我们希望能够只安装与特定操作系统相关的库。
推荐的机制是什么?
最佳答案
首先,确保您使用的是基于 SDK 的项目,以确保您对目标框架(如 netstandard*
)进行正确的依赖性调整(而不是使用 .nuspec 文件)。
目标是将您的 native 运行时 Assets 分离到 NuGet 文件夹内的 runtimes
子文件夹中,以便布局为:
\lib\YourManagedCode.dll
\runtimes\win-x86\native\some.dll
\runtimes\win-x64\native\some.dll
\runtimes\linux-x64\native\libsome.so
\runtimes\osx-x64\native\some.dylib
假设您已经有运行时文件夹,示例项目文件可能如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None Update="runtimes\**" Pack="true" PackagePath="runtimes" />
</ItemGroup>
</Project>
如果您需要在本地进行测试,您还可以添加 CopyToOutputDirectory="PreserveNewest"
以确保将文件复制到输出。对于用 [DllImport("some")]
注释的方法,.NET Core 应该能够解析位于运行时目录中的文件。
生成的 NuGet 包可以从 .NET Core 和 .NET Framework 项目中引用。如果某些“RID-fallback”(例如 win10-x64
=> win-x64
)在 .NET Framework 项目上不起作用,请确保该项目也引用了最新版本Microsoft.NETCore.Platforms
包(它为 NuGet 提供了一个已知值的图表,与 .NET Core 本身没有太大关系......)。
关于c# - C# nuspec 中的多平台 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52783863/