Azure Function出错:此平台不支持System.Drawing

var*_*ian 16 azure .net-core azure-functions .net-standard azure-functions-runtime

(如果这个问题措辞不够,有人可以帮我清理一下吗?)

我有一个Azure功能(2.0),它依赖于一些System.Drawing代码.我添加了一个NuGet引用System.Drawing.Common(4.5.0).

但是,在发布应用程序后,调用该函数时,会产生错误:

System.Private.CoreLib:执行函数时出现异常:[MyFunctionName].System.Drawing.Common:此平台不支持System.Drawing.

据我所知,现在.NET Core支持System.Drawing.Common,我相信我的Azure功能正在运行的环境.但实际项目是.NET Standard 2.0项目.

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

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

evi*_*obu 21

它不是关于CLR,而是关于沙箱.

System.Drawing在很大程度上依赖于GDI/GDI +来做它的事情.由于这些API(大型攻击面)的风险性有限,因此它们在App Service沙箱中受到限制.

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 +的使用.谢谢! (6认同)

Gia*_* C. 6

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

通过此设置,您的代码在支持 Core 3 的沙箱中运行(您不需要将 dll 重建为 Core3,我运行我的 .net core 2.1 dll 没有错误),令人惊讶的是...您没有得到这个例外不再是:

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

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

  • 我使用的是运行时版本 4.0,但在 .NET6 中出现错误。我可以使用 .NET6 隔离来修复它吗?或者我需要降级吗? (2认同)