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

.NET Linux环境下静态链接本地库遇System.DllNotFoundException求助

解决.NET AOT静态链接本地静态库时的System.DllNotFoundException问题

你的判断是对的——问题出在NativeLibrary项的用法上,它是给动态链接库(.so)用的,运行时会尝试查找对应的动态库文件,而你提供的是静态库(.a),所以才会抛出找不到文件的异常。按照下面的步骤修改配置即可解决:

1. 使用正确的静态库链接配置(.NET 7+)

直接将NativeLibrary替换为NativeReference,这是.NET官方为静态库链接提供的配置项,会把静态库代码嵌入到AOT编译后的可执行文件中。修改后的.csproj如下:

<ItemGroup>
    <!-- Generate direct PInvokes for Dependency -->
    <DirectPInvoke Include="nativelib" />
    <!-- 替换NativeLibrary为NativeReference,用于静态库链接 -->
    <NativeReference Include="nativelib.a" />
</ItemGroup>

同时确保项目已启用AOT编译,在PropertyGroup中添加:

<PropertyGroup>
    <PublishAot>true</PublishAot>
</PropertyGroup>

2. 旧版本.NET(.NET 6及更早)的兼容方案

如果使用的是.NET 6或更早版本,没有NativeReference项,需要手动指定链接器参数:

<PropertyGroup>
    <PublishAot>true</PublishAot>
    <!-- -L指定静态库所在路径,-l指定库名(去掉前缀lib和后缀.a) -->
    <LinkerFlags>$(LinkerFlags) -L/app -lnativelib</LinkerFlags>
</PropertyGroup>

<ItemGroup>
    <DirectPInvoke Include="nativelib" />
</ItemGroup>

验证静态链接是否成功

发布项目后,用ldd命令检查生成的可执行文件:

ldd ./bin/Release/net8.0/linux-x64/publish/YourAppName

如果输出中没有nativelib.so相关的依赖项,说明静态链接已成功,运行时不会再尝试加载动态库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:52:54