C#nuspec中的多平台本机库

时间:2018-10-12 16:48:45

标签: c# .net-core nuget cross-platform nuspec

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

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

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

我们只希望安装与特定操作系统有关的库。

推荐的机制是什么?

1 个答案:

答案 0 :(得分:2)

首先,请确保您使用的是基于SDK的项目,以确保针对netstandard*之类的目标框架进行正确的依赖关系调整(而不是使用.nuspec文件)。

目标是将本机运行时资产分成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

一个示例项目文件可能看起来像这样,假设您已经具有runtimes文件夹:

<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应该能够解析运行时目录中的文件。

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