.NET Core:在Docker上的Linux中使用System.Drawing.Common - 出现“无法打开显示器”错误

7
我已将代码移植到.NET Core,并使用了System.Drawing。目前看来,来自corefx的System.Drawing.Common已经支持Linux(请参见此处)。但是我在Linux上运行我的代码时遇到了困难。
特别是我遇到了以下错误:

NotSupportedException "Could not open display (X-Server required. Check your DISPLAY environment variable)"

该错误与以下代码有关:
Graphics gr = Graphics.FromHwnd(IntPtr.Zero);

之前我遇到了

DllNotFoundException "无法加载 DLL 'libX11': 找不到指定的模块或其某个依赖项。\n (来自 HRESULT: 0x8007007E 的异常)"

并且有以下堆栈跟踪:

   at System.Drawing.LibX11Functions.XOpenDisplay(IntPtr display)
   at System.Drawing.Graphics.FromHwnd(IntPtr hwnd)
   at mycode

但这个问题我通过安装libx11-dev软件包解决了。

以下是我的Dockerfile:

FROM microsoft/aspnetcore
ENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE true

# install libgdiplus for System.Drawing
RUN apt-get update && \
    apt-get install -y --allow-unauthenticated libgdiplus libc6-dev

# install x11 for System.Drawing
RUN apt-get update && \
    apt-get install -y --allow-unauthenticated libx11-dev

"无法打开显示器(需要X-Server,请检查您的DISPLAY环境变量)"错误该怎么办?


你能运行像xterm这样的普通X11程序吗? - n. m.
3
您需要至少安装 libgdiplus 及其所有依赖项。总的来说,使用真正的可移植解决方案,如 SkiaSharp,将是一个更好的选择,网址为 https://github.com/mono/SkiaSharp。 - Lex Li
@n.m. 它在 Docker 内部。应该提到它。 - Shrike
@LexLi 我已经安装了liggdiplus。 - Shrike
你应该把“在Docker内部”这部分内容移动到问题描述中。它可以解释为什么会失败,因为当Mono团队创建libgdiplus和他们的System.Drawing(Microsoft .NET Core 借用了相同的概念)时,从来没有像 Docker 这样的受限环境。Stack Overflow 不能提供太多帮助,因为你需要原始开发者的帮助或自己修改代码库。 - Lex Li
2
谢谢你的负评,这非常有帮助。 - Shrike
1个回答

1
也许,你可以使用基于图像的Graphics,而不是基于窗口的。就像这样:
var g = Graphics.FromImage(new Bitmap(1, 1));

1
但是如果我们不想将图像转换为光栅图像怎么办呢?(保持它为矢量图像..) - Roi Bar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接