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

时间:2018-08-17 23:59:58

标签: azure .net-core azure-functions .net-standard azure-functions-runtime

(如果这个问题的措词不好,有人可以帮我解决一下吗?)

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

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

  

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)。

2 个答案:

答案 0 :(得分:12)

这与CLR无关,而与sandbox有关。

System.Drawing在很大程度上依赖于GDI / GDI +。由于这些API(攻击面较大)具有一定的风险性质,因此将它们限制在App Service沙箱中。

  

Win32k.sys(User32 / GDI32)限制

     

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

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

答案 1 :(得分:3)

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

使用此设置,您的代码在支持Core 3的沙箱中运行(您无需将dll重建为Core3,我可以在没有错误的情况下运行.net core 2.1 dll),并且感到惊讶...您这样做不再有此异常了:

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

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