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

AWS Lambda使用System.Drawing.Common时libdl加载失败求助

问题:AWS Lambda上.NET Core 2.0使用System.Drawing.Common遭遇libdl加载失败

我们团队正在把一个缩略图生成的Lambda函数升级到.NET Core 2.0版本,但在使用Microsoft官方的System.Drawing.Common NuGet包时,遇到了棘手的初始化错误,具体报错信息如下:

TypeInitializationException
'Gdip'的类型初始值设定项引发异常。调用栈:at System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromScan0(Int32 width, Int32 height, Int32 stride, Int32 format, HandleRef scan0, IntPtr& bitmap) at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format) at TestFailExample.Function.FunctionHandler(String input, ILambdaContext context) in C:\work\graphics\TestFailExample\Function.cs:line 25 at lambda_method(Closure , Stream , Stream , LambdaContextInternal )

根因追踪

深入排查后发现,这个错误的底层原因是DllNotFoundException:

DllNotFoundException
无法加载DLL 'libdl':指定的模块或其依赖项之一未找到。(Exception from HRESULT: 0x8007007E) at Interop.Libdl.dlopen(String fileName, Int32 flag) at System.Drawing.SafeNativeMethods.Gdip.LoadNativeLibrary() at System.Drawing.SafeNativeMethods.Gdip..cctor()

最小复现代码

下面是能复现问题的最简代码片段:

public string FunctionHandler(string input, ILambdaContext context) 
{ 
    using (var bmp = new Bitmap(100, 100)) 
    { 
        return bmp.Width.ToString(); 
    } 
}

已尝试的无效解决方法

我们试过不少方案,但都没能解决问题:

  • 确认Lambda环境里/lib64/libdl.so.2是存在的,但缺少/lib64/libdl.so,可惜Lambda的文件系统是只读的,没法创建符号链接
  • 修改LD_LIBRARY_PATH环境变量,试图让程序找到正确的库文件
  • 把libdl.so和libgdiplus.so手动打包到部署包里一起上传
  • 改用CoreCompat的绘图库替代官方的System.Drawing.Common

另外补充一点:在本地的Linux实例上测试相同的代码,System.Drawing.Common是可以正常工作的,说明代码本身没有问题,问题出在Lambda的运行环境上。

后续进展

后来我们尝试用AWS Lambda Layers导入Docker Amazon Linux镜像里的相关依赖包,但还是没能解决libdl的加载问题;而且部分第三方绘图库还存在无法正确渲染日文文本的问题,目前我们已经临时用Go重写了这个Lambda函数,但还是希望能找到一个可行的C#解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:40