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
相关产品推荐
相关产品推荐

