我们有一个缩略图生成器lambda函数,我正在尝试更新到.NET Core2.0,但是在使用微软的System.Drawing.Common NuGet包时遇到了以下错误:
TypeInitializationException “Gdip”的类型初始化引发了一个异常。在System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromScan0(Int32宽度、Int32高度、Int32步长、Int32格式、HandleRef scan0、IntPtr&位图上( Int32宽度、Int32高度、PixelFormat格式)在C:\work\graphics\TestFailExample\Function.cs:line 25 at lambda_method(闭包、流、流、LambdaContextInternal )的System.Drawing.Bitmap..ctor(Int32宽度、Int32、PixelFormat格式)上的System.Drawing.Bitmap..ctor(Int32宽度、Int32、PixelFormat格式)
起因于
DllNotFoundException 无法加载DLL 'libdl':无法找到指定的模块或其依赖项之一。\n( System.Drawing.SafeNativeMethods.Gdip.LoadNativeLibrary() at System.Drawing.SafeNativeMethods.Gdip..cctor()的Interop.Libdl.dlopen(String fileName,Int32标志)处的Interop.Libdl.dlopen(字符串fileName,Int32标志)处的\n( HRESULT: 0x8007007E中的例外)
我见过这的问题,但没有解决办法。
复制该问题的最低限度代码如下:
public string FunctionHandler(string input, ILambdaContext context)
{
using (var bmp = new Bitmap(100, 100))
{
return bmp.Width.ToString();
}
}只需创建一个.NET Core2.0Lambda函数项目,添加对System.Drawing.Common NuGet包的引用,并用上述代码替换函数处理程序。把它扔到AWS上,然后运行它以得到错误。我已经注意到,在尝试实际使用包之前,引用包不会导致问题,但这可能是编译器优化的结果。
我已经将MCVE打包到一个项目中,并将其上传到GitHub 这里,以简化人们复制问题所需的步骤。
我可以看到/lib64/libdl.so.2存在,但/lib64/libdl.so不存在。由于符号链接似乎是不可能的(只读文件系统),我不知道如何解决这个问题。我尝试使用LD_LIBRARY_PATH环境变量,方法是在/tmp中创建一个文件夹,并将该文件作为该函数的第一件事进行符号链接。不幸的是,它似乎在这里查找所有的库,因此这个函数根本不运行。我还尝试将LD_LIBRARY_PATH设置为/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/tmp,尽管我现在可以再次运行该函数,但这仍然没有帮助,我只得到了相同的Gdip错误。
我注意到/var/task/lib已经包含在LD_LIBRARY_PATH中,所以我尝试用函数打包libdl.so和libgdiplus.so,但是这也失败了,这次声明在libdgiplus.so中找不到入口点GdiplusStartup。这些文件不是来自Amazon实例,所以我现在尝试安装Mono并从Amazon实例中获取它们。这一点也没有帮助。
我尝试过使用CoreCompat 绘图库,但这也报告了与libgdiplus.so相关的问题,即使我尝试将其与函数捆绑在一起。
从那时起,我就在我自己的Linux实例上尝试过了,并且可以确认System.Drawing.Common可以工作。
有什么聪明的解决方案可以让我在AWS上使用System.Drawing.Common吗?还有其他方法可以让我的lambda函数有libdl并工作吗?
更新:
我们最近的尝试涉及使用AWS Lambda层,仔细提取Docker Amazon Linux映像中apt安装的所有包,然后将它们应用到自己的层中。尽管如此,我们最终还是谈到了"libdl“问题,所以我们放弃了。
人们对图书馆提出的许多问题是,他们没有正确地呈现日文文本,这对我们来说很重要。这似乎是一个无法在AWS上取得更好效果的问题--它没有帮助,而且最终用Go重写我们的函数要比继续使用C#更容易。
由于下面的答案中提到的库似乎适合一般使用--而且现在可能确实支持日语文本--我已经选择接受我肯定会在AWS Lambda上工作的答案。
发布于 2018-12-05 18:50:54
对于.NET核Lambda中的图像处理,我使用SixLabors.ImageSharp
下面是我在最近的AWS re:processing中使用的代码,它做了一个日志(如果图像处理):
var imageBuffer = new MemoryStream();
var resizeOptions = new ResizeOptions
{
Size = new SixLabors.Primitives.Size { Width = this.TileSize, Height = this.TileSize},
Mode = ResizeMode.Stretch
};
image.Mutate(x => x.Resize(resizeOptions));
image.Save(imageBuffer, new SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder());
imageBuffer.Position = 0;发布于 2019-04-09 00:29:22
在将应用程序上传到运行DotNetCore2.1.500版本的Ubuntu 18服务器上后,我也遇到了同样的问题。我使用这个解决方案https://github.com/dotnet/dotnet-docker/issues/618使用MichaelSimons建议解决了这个问题。
我跑了
#sudo apt-get update
#sudo apt-get install -y --allow-unauthenticated \
libc6-dev \
libgdiplus \
libx11-dev \
#sudo rm -rf /var/lib/apt/lists/*这解决了这些问题。
https://stackoverflow.com/questions/50615704
复制相似问题