Azure函数给出错误:系统。此平台不支持绘图
(如果这个问题措词不当,有人能帮我澄清一下吗?) 我有一个Azure函数(2.0),它依赖于一些系统绘图代码。我已经添加了对System.Drawing.Common(4.5.0)的NuGet引用 但是,发布应用程序后,调用函数时,会产生以下错误: System.Private.CoreLib:执行函数时发生异常: [MyFunctionName]。System.Drawing.Common:System.Drawing不是 在这个平台上支持 据我所知,System.Drawing.Common现在在.NET Core上受支持,我相信这就是运行Azure功能的环境。不过,实际的项目是一个.NET标准2.0项目 我对如何解决这个问题感到困惑。我曾尝试将该项目转换为.NET Core 2.1项目,但这导致了与“元数据生成失败”相关的奇怪错误,并且无法找到System.RuntimeAzure函数给出错误:系统。此平台不支持绘图,azure,.net-core,azure-functions,.net-standard,azure-functions-runtime,Azure,.net Core,Azure Functions,.net Standard,Azure Functions Runtime,(如果这个问题措词不当,有人能帮我澄清一下吗?) 我有一个Azure函数(2.0),它依赖于一些系统绘图代码。我已经添加了对System.Drawing.Common(4.5.0)的NuGet引用 但是,发布应用程序后,调用函数时,会产生以下错误: System.Private.CoreLib:执行函数时发生异常: [MyFunctionName]。System.Drawing.Common:System.Drawing不是 在这个平台上支持 据我所知,System.Drawing.Common
如果相关的话,我的项目将引用Microsoft.Azure.WebJobs.Extensions.EventGrid(2.0.0-beta2)。这不是关于CLR,而是关于 绘图严重依赖GDI/GDI+来完成它的工作。由于这些API(大型攻击面)的风险性质,它们被限制在应用程序服务沙箱中 Win32k.sys(User32/GDI32)限制 为了彻底减少攻击表面积,沙箱阻止几乎所有的Win32k.sys API被调用,这实际上意味着大多数User32/GDI32系统调用被阻止。对于大多数应用程序,这不是问题,因为大多数Azure Web应用程序不需要访问Windows UI功能(它们毕竟是web应用程序)
尝试寻找一个不依赖System.Drawing/GDI的不同库,比如。一点更新可以帮助很多人。 现在,您可以将Azure功能切换到v3: 在功能应用程序设置面板->运行时版本~3中 使用此设置,您的代码在支持Core 3的沙箱中运行(您不需要将dll重建为Core3,我运行的.net Core 2.1 dll没有错误),令人惊讶的是……您不再出现此异常: System.Drawing.Common:此平台不支持System.Drawing 因为CLI可以在子系统中找到需要的GDI/GDI+。
现在,我可以将html转换为pdf而不会发疯。我对幕后发生的事情有一些根本性的误解。据我所知,如果你可以参考NuGet软件包,你可以使用它提供的任何API(它们会“正常工作”)。我现在了解到,System.Drawing.Common NuGet包允许这些绘图API在支持它的平台上工作,但如果不支持,则会出现运行时异常。我也感到困惑,因为我知道我的Azure函数在Windows上运行,但正如您指出的,沙盒环境限制了GDI+用法。谢谢!使用System.Drawing.Common,如何将html转换为pdf?可以使用Puppeter之类的工具,但也不需要System.Drawing.Common。