C# nuspec 中的多平台本机库

Jai*_*ime 4 c# cross-platform nuget nuspec .net-core

我们有一个跨平台的 C# 项目(.net Core)。它使用本地库 (C++),每个平台都不同。

我们知道您可以在单个 nuspec 文件中指定不同的框架,但这种情况有所不同:

  • 将有一个 C# DLL 文件
  • 会有不同的本地库(比如 a.linux.so 和 a.windows.dll)

我们希望能够仅安装与特定操作系统相关的库。

推荐的机制是什么?

Mar*_*ich 7

首先,确保您使用的是基于 SDK 的项目,以确保为目标框架netstandard*(而不是使用 .nuspec 文件)获得正确的依赖项修剪。

目标是将您的本机运行时资产分离到runtimesNuGet 文件夹内的一个子文件夹中,以便布局:

\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
Run Code Online (Sandbox Code Playgroud)

示例项目文件可能如下所示,假设您已经拥有 runtimes 文件夹:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <None Update="runtimes\**" Pack="true" PackagePath="runtimes" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

如果您需要在本地进行测试,您还可以添加CopyToOutputDirectory="PreserveNewest"以确保将文件复制到输出中。.NET Core 应该能够解析运行时目录中带有[DllImport("some")].

生成的 NuGet 包可以从 .NET Core 和 .NET Framework 项目中引用。如果某些“RID 回退”(例如win10-x64=> win-x64)在 .NET Framework 项目上不起​​作用,请确保该项目还引用了Microsoft.NETCore.Platforms包的最新版本(它为 NuGet 提供了已知值的图表,与.NET Core 本身......)。