You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为各支持架构在NuGet中单独发布原生库二进制包?

针对.NET 6按RID发布独立原生NuGet包的实现方案

1. 原生包命名约定

是的,强烈建议遵循[库名].native.[RID]的命名格式,比如Foo.native.linux-x64、Foo.native.win-x64、Foo.native.osx-x64。这种命名是.NET生态的通用约定,使用者能一眼识别包对应的平台,同时NuGet的依赖解析逻辑也能更好地匹配运行时环境。

2. 原生库在包中的存放位置

必须放在runtimes/[RID]/native/目录下,这是.NET运行时自动加载原生库的约定路径:

  • Windows平台:runtimes/win-x64/native/Foo.dll
  • Linux平台:runtimes/linux-x64/native/libFoo.so
  • macOS平台:runtimes/osx-x64/native/libFoo.dylib
    只要按这个结构打包,.NET会在运行时根据当前系统的RID自动找到并加载对应的原生库,无需手动编写路径解析代码。

3. 项目文件配置

分两种场景处理:

场景1:打包原生包本身

用SDK风格项目(.csproj)配置最简单,无需单独编写nuspec文件。以linux-x64平台的包为例,项目文件内容如下:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageId>Foo.native.linux-x64</PackageId>
    <Version>1.0.0</Version>
    <Authors>你的名字/团队</Authors>
    <Description>Foo原生库(linux-x64平台)</Description>
    <PackageType>Native</PackageType> <!-- 标记为原生包类型,可选但推荐 -->
  </PropertyGroup>
  <ItemGroup>
    <!-- 将原生库文件打包到指定路径 -->
    <None Include="libFoo.so" Pack="true" PackagePath="runtimes/linux-x64/native/" />
  </ItemGroup>
</Project>

其他平台的包只需修改PackageId、RID路径和对应的原生文件即可。

场景2:主.NET库依赖这些原生包

如果有一个主库(比如Foo.dll)需要调用原生库,只需在主库的项目文件中添加对所有原生包的引用,NuGet会自动根据使用者的运行环境下载对应RID的包:

<ItemGroup>
  <PackageReference Include="Foo.native.win-x64" Version="1.0.0" />
  <PackageReference Include="Foo.native.linux-x64" Version="1.0.0" />
  <PackageReference Include="Foo.native.osx-x64" Version="1.0.0" />
</ItemGroup>

内容的提问来源于stack exchange,提问作者sdgfsdh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:27:39