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

.NET Core 2.0 AWS Lambda部署Aspose.Net时libdl加载失败求助

解决方案:解决AWS Lambda上Aspose.PDF依赖libdl的问题

我之前遇到过完全一样的问题,当时也是用Aspose.PDF在Lambda上跑.NET Core 2.0函数,踩过这个libdl的坑,给你两个可行的解决方案,优先推荐代码层面的,不用改打包流程:

方案1:代码层面重定向Dll导入(推荐,无需修改打包流程)

Lambda的Amazon Linux 2环境中只有libdl.so.2,而System.Drawing.Common默认尝试加载libdl(也就是libdl.so)。我们可以通过NativeLibrary.SetDllImportResolver来指定当程序请求libdl时,实际加载libdl.so.2。

在你的Lambda函数类中添加静态构造函数(会在函数首次加载时执行):

using System.Runtime.InteropServices;

public class Function
{
    // 静态构造函数,拦截Dll加载请求
    static Function()
    {
        NativeLibrary.SetDllImportResolver(typeof(System.Drawing.SafeNativeMethods.Gdip).Assembly, (libraryName, assembly, searchPath) =>
        {
            if (string.Equals(libraryName, "libdl", StringComparison.OrdinalIgnoreCase))
            {
                // 替换为系统中存在的libdl.so.2
                return NativeLibrary.Load("libdl.so.2", assembly, DllImportSearchPath.SafeDirectories);
            }
            // 其他库保持默认加载逻辑
            return IntPtr.Zero;
        });
    }

    // 你的现有FunctionHandler代码...
    public async Task FunctionHandler(S3Event s3Event, ILambdaContext context)
    {
        // 你的PDF处理逻辑...
    }
}

这段代码不需要额外打包任何文件,直接用AWS Toolkit部署即可,完美适配你的开发流程。

方案2:打包时添加libdl.so的替身文件

如果你更倾向于通过打包文件解决,可以从Amazon Linux 2环境中获取libdl.so.2文件,重命名为libdl.so后打包进部署包:

  1. 获取libdl.so.2文件:
    • 用Docker拉取Amazon Linux 2镜像:docker run -it amazonlinux:2 bash
    • 在容器中复制文件:cp /lib64/libdl.so.2 /本地项目路径/NativeLibs/
    • 退出容器,把文件放到项目的NativeLibs目录下
  2. 修改项目文件(.csproj):
    添加以下配置,确保文件被复制到输出目录并重命名:
    <ItemGroup>
      <None Update="NativeLibs/libdl.so.2">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      </None>
    </ItemGroup>
    <Target Name="RenameLibdl" AfterTargets="CopyFilesToOutputDirectory">
      <Copy SourceFiles="$(OutputPath)NativeLibs/libdl.so.2" DestinationFiles="$(OutputPath)libdl.so" OverwriteReadOnlyFiles="true" />
    </Target>
    <Target Name="RenameLibdlPublish" AfterTargets="Publish">
      <Copy SourceFiles="$(PublishDir)NativeLibs/libdl.so.2" DestinationFiles="$(PublishDir)libdl.so" OverwriteReadOnlyFiles="true" />
    </Target>
    
  3. 用AWS Toolkit重新发布函数,此时部署包中会包含libdl.so,程序就能正常加载了。

注意事项

  • 确保你的项目已经安装了System.Drawing.Common NuGet包(Aspose.PDF 18.5应该已经依赖这个包,但可以确认一下)
  • .NET Core 2.0的Lambda运行时基于Amazon Linux 2,所有原生依赖都要适配这个环境
  • 如果后续遇到其他GDI+相关错误,可能需要额外处理libgdiplus,但Lambda环境默认已经包含这个库

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:18:58