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

NuGet包中外部.so库未复制至输出目录的问题排查

问题原因

你遇到的情况是由.NET NuGet的默认处理逻辑导致的:

  • 放在lib\$(TargetFramework)目录下的.dll文件会被NuGet识别为.NET相关程序集(即使是非托管原生DLL),因此会自动复制到项目输出目录;
  • .so这类Linux原生库不属于.NET程序集范畴,即便通过<Content>打包到lib目录,NuGet也不会自动将其复制到输出目录。
解决方案

推荐采用.NET官方支持的原生库标准打包方式,将不同平台的库归类到runtimes/{RuntimeIdentifier}/native目录下,NuGet会根据目标项目的运行时自动复制对应平台的文件。

修改NuGet项目的csproj配置如下:

<!-- 打包Windows x64原生DLL -->
<ItemGroup>
  <NativeLibrary Include="..\..\Lib\win64\dll\ericapi.dll">
    <Pack>true</Pack>
    <PackagePath>runtimes/win-x64/native/ericapi.dll</PackagePath>
  </NativeLibrary>
</ItemGroup>

<!-- 打包Linux x64原生SO -->
<ItemGroup>
  <NativeLibrary Include="..\..\Lib\lin64\lib\libericapi.so">
    <Pack>true</Pack>
    <PackagePath>runtimes/linux-x64/native/libericapi.so</PackagePath>
  </NativeLibrary>
</ItemGroup>

配置生效后:

  • 当项目以win-x64为运行时启动/发布时,ericapi.dll会自动复制到输出目录对应位置;
  • 当项目以linux-x64为运行时启动/发布时,libericapi.so会被自动复制到对应位置。

如果暂时无法修改NuGet包,也可以在Web项目的csproj中手动添加复制规则,强制复制所有.so文件:

<ItemGroup>
  <Content Include="$(NuGetPackageRoot)**\*.so">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

但这种方式需要每个使用该NuGet包的项目都手动配置,不如修改NuGet包的打包方式优雅。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:05:09