.NET 6 使用 System.Drawing.Common 出现 The type initializer for ‘Gdip’ threw an exception 异常的解决办法
出现问题的原因
在Linux环境部署.NET Core程序时,如果要到System.Drawing.Common引用会出现该问题,目前大量的第三方组件使用该Windows专用库,尤其是涉及图片处理、Word相关的组件、二维码等
问题现象
出现相关Gdip异常,安装相应组件后重启项目及服务器无效,异常如下
1 | The type initializer for 'Gdip' threw an exception. |
解决办法
.NET 6之前
在Linux服务器上安装 libgdiplus 即可解决
libgdiplus
是System.Drawing.Common
原生端跨平台实现的主要提供者,是开源mono项目
安装步骤(以Centos 7为例)
更新包
1
yum install -y epel-release
查找包
1
2
3
4yum whatprovides libgdiplus
# 输出以下内容,具体以显示为准,注意版本号
# libgdiplus-2.10-10.el7.x86_64 : An Open Source implementation of the GDI+ API.安装包
1
yum install -y libgdiplus-2.10-10.el7.x86_64
.NET 6及以后
由于官方不再支持在非Windows环境使用libgdiplus,需要单独开启运行时环境支持
处理步骤
按照.NET 6之前的方案安装 libgdiplus
runtimeconfig.json配置文件中新增
System.Drawing.EnableUnixSupport
1
2
3
4
5
6
7{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}构建项目时,会在输出目录中生成*[appname].runtimeconfig.json*文件,只需要修改该配置文件即可
其他建议
官方不再建议使用libgdiplus,主要是原因是libgdiplus非常臃肿、外部依赖众多、未解决bug及异常情况难以修复,修改[appname].runtimeconfig.json只是临时方案,需要逐步迁移到以下项目