项目上需要使用 Spire.Pdf组件的PdfPageBase对象,对上传的发票进行解析,结果引发了下面的运行时异常:
System.TypeInitializationException : The type initializer for ‘Gdip’ threw an exception.
—- System.PlatformNotSupportedException : System.Drawing.Common is not supported on non-Windows platforms. See https://aka.ms/systemdrawingnonwindows for more information.
一开始没有在意上面的地址,翻(多)阅(走)资(弯)料(路)发现,Linux环境下需要安装 libgdiplus,libc6-dev组件,但是这些组件在docker镜像打包生成的时候就已经添加进来了。
后来跌跌撞撞又回到了起点,官方文档表示
System.Drawing.Common NuGet 包现在被归为 Windows 特定的库。 在为非 Windows 操作系统编译时,平台分析器会在编译时发出警告。
在非 Windows 操作系统上,除非设置了运行时配置开关,否则将引发 TypeInitializationException 异常,其中 PlatformNotSupportedException 作为内部异常。
也给出了修改建议
若要将这些 API 用于跨平台应用,请迁移到以下库之一:
或者,可通过将 runtimeconfig.json 文件中的
System.Drawing.EnableUnixSupport
运行时配置开关设置为true
来启用对 .NET 6 中非 Windows 平台的支持。runtimeconfig.template.json 模板文件:
{ "configProperties": { "System.Drawing.EnableUnixSupport": true } }
[appname].runtimeconfig.json 输出文件:
{ "runtimeOptions": { "configProperties": { "System.Drawing.EnableUnixSupport": true } } }
备注
- 添加此配置开关是为了让严重依赖此包的跨平台应用有时间迁移到更新式的库。 但是,不会修复非 Windows bug。
- 此开关仅在 .NET 6 中可用,已在 .NET 7 中删除。
这里由于修改的内容较多,暂时采用了第二种方案:
在启动项目根目录创建 runtimeconfig.template.json 文件,复制上面的内容,顺利识别成功。注意该方式只在.NET 6版本有效果.