首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AWS上使用System.Drawing.Common NuGet包时无法加载DLL 'libdl‘

在AWS上使用System.Drawing.Common NuGet包时无法加载DLL 'libdl‘
EN

Stack Overflow用户
提问于 2018-05-31 02:13:22
回答 4查看 12K关注 0票数 23

我们有一个缩略图生成器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中的例外)

我见过的问题,但没有解决办法。

复制该问题的最低限度代码如下:

代码语言:javascript
复制
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上工作的答案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-12-05 18:50:54

对于.NET核Lambda中的图像处理,我使用SixLabors.ImageSharp

下面是我在最近的AWS re:processing中使用的代码,它做了一个日志(如果图像处理):

代码语言:javascript
复制
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;
票数 -1
EN

Stack Overflow用户

发布于 2019-04-09 00:29:22

在将应用程序上传到运行DotNetCore2.1.500版本的Ubuntu 18服务器上后,我也遇到了同样的问题。我使用这个解决方案https://github.com/dotnet/dotnet-docker/issues/618使用MichaelSimons建议解决了这个问题。

我跑了

代码语言:javascript
复制
#sudo apt-get update
#sudo apt-get install -y --allow-unauthenticated \
        libc6-dev \
        libgdiplus \
        libx11-dev \ 
#sudo rm -rf /var/lib/apt/lists/*

这解决了这些问题。

票数 6
EN

Stack Overflow用户

发布于 2019-03-26 07:02:27

我为这个问题找到了一个对我有用的解决方案:

首先,我从项目中删除了System.Drawing.Common库,然后安装了您可以找到的这里库。它使用相同的类。

代码语言:javascript
复制
using System.Drawing
...
var bmp = new Bitmap(100,100);

最后,我安装了其他库,其中包含了在Linux和Lambda上使用绘图库所必需的所有dll。通过执行这个步骤,代码可以上传到AWS中,不会有任何问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50615704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档