c# - C# nuspec 中的多平台 native 库

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

我们有一个跨平台的 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/

相关文章:

c# - 获取上次写入时间返回一个奇怪的值

c# - EF 核心实体数据访问中的强制转换无效

c# - .Net Core 2.1项目,为什么Nuget会还原.Net 4.6.1包?

c# - 是否可以使用构建宏在 powershell 中设置 OutputPath?

c# - 使用 log4net 版本 2.0.3 执行登录数据库

c# - 缺少 Html 实体解码支持 BY C# WPF 中的特殊字母/字符

c# - 正则表达式全局替换为组

c# - 绑定(bind)两个不同类但具有相似属性的对象

c# - 在 Rider 中反编译 ASP.NET Core 3.x 源代码

asp.net-mvc-3 - 我应该从 NuGet 安装哪个 Ninject 版本?