C#winform软件移植上linux的秘密,用GTK开发System.Windows.Forms

发布时间 2023-07-06 18:44:19作者: j.king

  国产系统大势所趋,如果你公司的winform界面软件需要在linux上运行,如果软件是用C#开发的,现在我有一个好的快速解决方案。

  世界第一的微软的Microsoft Visual Studio,确实好用,C# 开发起来确实效率高,不过微软的开发语言开发的软件的界面都是跟windows系统绑定的,现在.net core已经支持linux系统了,但是不包含WindowDesktop,所以是不支持原生有界面的.net 软件的,微软语言的软件界面所用的API基本都封装在System.Windows.Forms.dll上了,所以用支持linux的工具重新开发System.Windows.Forms类库就能让C#软件的界面在linux运行!

  首先,必须是.net core 框架开发C#软件的,工程框架要改成控制台,C#软件升级开发框架也是很容易。其次,安装GTK环境,基本是一键安装完成。

  最近机缘巧合,公司软件需要移植上linux运行,研究后发现,软件太复杂,开发了十几年的软件,重新开发工程量就很大,而且程序的复杂性都无法保证能移植成功。就突发奇想,如果把GTK表单控件封装成C#的控件直接替换c#的原生表单控件不就行了吗?然后试了一下确实可以!而且能保留VS的原生可视化开发。目前已经实现了常用的表单控件、容器、菜单、数据表、选择器,先看效果:

 

封装起来是很复杂的,GTK提供的是基础组件,要把组件拆分重新组合成微软原生控件的组成结构,并且要实现相关的功能。 有些微软的表单控件GTK是没有,需要自制,如掩码输入框、日期选择框、选择框列表,DataGridView是用GTK.TreeView来封装实现的,很多控件的赋值方法和数据源模式都不一样,也需要改。我封装的控件都实现了C#原生控件的常用属性、事件、方法,以保证与原生程序兼容。

 

需要说明一下,界面或工程的使用的图片资源是在生成程序后是经过加密的,而微软件图像类和资源读取方法类库都是放在WindowDesktop库上,控制台工程是没有相关的类库的,所以无法读取。Form图像处理有个麻烦的地方,界面有任何变动,Form.Designer图像程序都读程序都会自动更新为System.ComponentModel.ComponentResourceManager,所以自定义命名空间是不行的,一变动又要修正。

我的解决方法是自已写System.Drawing.Image和System.Drawing.Bitmap,自写System.ComponentModel.ComponentResourceManager类读取图片,把Form界面的xxx.resx源文件制到到一个文件夹内,直接当成XML文件来读取,就能把里面的图像读取出来,然后转成byte[]数据传给Bitmap。

在使用封装好的引用的System.Windows.Forms.DLL时,还需要引用System.Resources.Extensions,这个在实现程序里用不上,但是VS开发需要,而且有些版本的还不行,会出错,经过测试用.net core2的版本可以

 

最后,控制台框架开发是没有界面的,而Form界面在控制台框架工程里默认也不能打开的,但是可以改配置来修正,只需要把obj目录子目录下找到xxxx.designer.runtimeconfig.json文件,把NetCore改成WindowDesktop即可,如下红字

"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.WindowsDesktop.App",
"version": "6.0.0"
},

然后就可以在控制台框架下愉快的开发表单了。