一、扯淡
光阴荏苒,日月如梭。转眼2017年就这么过去了。在这2017年里本人遇见了很多人,遇到了很多事。如果要从其中挑出一件最遗憾的事情,那大概就是.net Core 2.0居然不支持System.Drawing命名空间。
从.net Core出来开始,笔者就开始关注它了,无奈一开始的时候各种基础库都不完全,所以就把它放在第一位上。
后来听说.net Core将在2017年年中的样子发布,顺带一块发布.net Standard 2.0,而.net Standard作为.net API的一个正式规范,支持相同.net Standard版本号的.net实现都应该支持相同的API,而.net Core 2.0和.net Framework 4.6.1都支持.net Standard 2.0,也就是说.net Core 2.0应该使用起来和.net Framework 4.6.1一致。(具体.net Standard实现支持请参阅:https://docs.microsoft.com/en-us/dotnet/standard/net-standard)
为了准备.net Core 2.0,我还特地将非Win32绑定的辅助类做了.net Standard适配。
然而非常遗憾的是在8月15日发布的.net Core 2.0中,我们虽然看到了System.Drawing命名空间的回归,但在这个命名空间中,只有一些结构体,我们盼星星盼月亮期待着的Image和Graphics类依旧不存在。
二、解决办法
.net Core 2.0出来之前和朋友吹牛打包票说:“你们放心,等.net Core 2.0出来了我就把我们之前的几个系统迁过去。”结果牛逼是吹了,现在发现没有绘图库真的就很悲伤。
不过好在后来经过高人指点说,可以使用第三方库去解决这个问题。
后来经过一番搜索,发现有个叫做“ZKWeb.System.Drawing”的第三方库,可以完美解决在.net Core 2.0上使用GDI+绘图这个问题。
首先打开项目,对着项目右键选择“管理 NuGet 程序包”,然后在浏览页中的搜索框里输入“ZKWeb.System.Drawing”
然后安装同名类库。
第二步,将项目中所有“System.Drawing”改为“System.DrawingCore”即可。
现在就可以按F5进行调试查看效果了,非常完美。
三、注意事项
ZKWeb.System.Drawing这个第三方库据作者所说,是移植于Mono 4.6.1.13,如果需要在Linux下运行使用,需要先安装libgdiplus程序包。
如果没有提前安装libgdiplus程序包,程序在运行时会抛出一个“System.TypeInitializationException”异常:
安装libgdiplus程序包非常方便,以CentOS为例,只需要执行下面的命令:
1
2
3
4
5
6
7
8
9
10
11
12
|
git
libtool
devel
devel
devel
libgdiplus
libgdiplus
.sh
make
install
/
.dll
|
其他系统如何安装libgdiplus,可以参阅Github上的ZKWeb.System.Drawing项目说明(项目地址:https://github.com/zkweb-framework/zkweb.system.drawing),现在ZKWeb.System.Drawing除了支持CentOS 7+以外,还支持Ubuntu 16.04+和Fedora 23+。
后记:
其实笔者在这里用官方给出的方案并没有成功,最后是用了下面的方案:
1
2
3
|
release
fast
devel
|
在安装好libgdiplus程序包之后重新运行项目发现,现在验证码是能够成功绘制出来了,但验证码图片上显示的字符并不正确:
乱码是什么鬼?
经过排查,发现是因为笔者用的CentOS中,没有绘制验证码时使用的“Arial”字体。所以我们还要添加所需字体。
要在CentOS中查看当前系统已安装的字体列表,请使用命令:
1
|
list
|
如果不存在此命令,请使用下面的命令安装:
1
|
fontconfig
|
然后从Windows系统的C:\Windows\Fonts目录中,复制出arial.ttf,并上传到CentOS主机中的/usr/share/fonts/lyx目录下,然后更新字体缓存:
1
|
cache
|
更新字体缓存后重新查看字体列表,如果列表中出现了arial.ttf字体文件则表明字体添加成功。
重新启动我们的.net Core项目查看效果:
完美。
四、写在最后
俗话说,万事开头难。现在的.net Core已经走到了2.0这个大版本,回想当年.net Framework也是从2.0这个版本开始有了起色,相信不久的将来荣光终将会降临于.net Core。
另外,根据Github中的讨论,官方版本的System.Drawing库可能将在.net Core 2.1中被添加支持,尽请期待。
完美 :)
请发表评论