Azure 函数给出错误:此平台不支持 System.Drawing

Posted

技术标签:

【中文标题】Azure 函数给出错误:此平台不支持 System.Drawing【英文标题】:Azure Function gives error: System.Drawing is not supported on this platform 【发布时间】:2019-01-25 00:17:25 【问题描述】:

(如果这个问题措辞不好,有人可以帮我弄清楚吗?)

我有一个依赖于一些 System.Drawing 代码的 Azure 函数 (2.0)。我添加了对 System.Drawing.Common (4.5.0) 的 NuGet 引用。

然而,在发布应用程序后,当调用该函数时,它会产生错误:

System.Private.CoreLib:执行函数时出现异常: [我的功能名称]。 System.Drawing.Common:System.Drawing 不是 在这个平台上支持。

据我所知,.NET Core 现在支持 System.Drawing.Common,我相信这是我的 Azure Function 运行的环境。不过,实际项目是一个 .NET Standard 2.0 项目。

我很困惑如何解决这个问题。我尝试将项目转换为 .NET Core 2.1 项目,但这导致了与“元数据生成失败”相关的奇怪错误以及无法找到 System.Runtime。

如果相关,我的项目会引用 Microsoft.Azure.WebJobs.Extensions.EventGrid (2.0.0-beta2)。

【问题讨论】:

【参考方案1】:

这不是关于 CLR,而是关于 sandbox。

System.Drawing 严重依赖 GDI/GDI+ 来完成它的工作。由于这些 API 具有一定风险的性质(攻击面大),它们被限制在应用服务沙箱中。

Win32k.sys (User32/GDI32) 限制

为了彻底减少攻击面,沙箱阻止了几乎所有的 Win32k.sys API 被调用,这实际上意味着大部分 User32/GDI32 系统调用都被阻止了。大多数应用程序这不是问题,因为大多数 Azure Web 应用程序不需要访问 Windows UI 功能(它们毕竟是 Web 应用程序)。

尝试找到不依赖 System.Drawing/GDI 的其他库,例如 ImageSharp。

【讨论】:

我对幕后发生的事情有一些基本的误解。据我所知,如果您可以引用 NuGet 包,则可以使用它提供的任何 API(它们会“正常工作”)。我现在了解到 System.Drawing.Common NuGet 包允许这些绘图 API 工作,前提是你在支持它的平台上,但如果你不是,它将失败并出现运行时异常。我也很困惑,因为我知道我的 Azure 函数在 Windows 上运行,但正如您所指出的,沙盒环境限制了 GDI+ 的使用。谢谢!【参考方案2】:

一点点更新可以帮助很多人。 现在您可以将 Azure Function 切换到 v3: 在函数应用设置面板 -> 运行时版本 ~3

通过此设置,您的代码在支持 Core 3 的沙箱中运行(您无需将 dll 重新构建到 Core3,我运行我的 .net core 2.1 dll 时不会出错),令人惊讶的是...... '不再出现此异常:

System.Drawing.Common:此平台不支持 System.Drawing。

因为 CLI 可以在子系统中找到需要的 GDI/GDI+。 现在我可以将 html 转换为 pdf 而不会发疯。

【讨论】:

使用System.Drawing.Common,如何将html转为pdf?可以使用 puppeteer 之类的东西来做到这一点,但也不需要 System.Drawing.Common。 你是救生员!

以上是关于Azure 函数给出错误:此平台不支持 System.Drawing的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数计时器 SQL 客户端失败

Azure AD Graph:此平台不支持安全二进制序列化

使用 c# 从 Azure 存储帐户表中检索记录,同时使用 xamarin 开发跨平台应用程序给出错误

Azure Databricks:此群集的运行时版本不支持

目标平台 Azure SQL 数据库不支持 CREATE SEARCH PROPERTY LIST

本地作品。 Azure 给出错误:无效的对象名称“dbo.AspNetUsers”。为啥?