C#winform软件移植上linux的秘密,用GTK开发System.Windows.Forms
国产系统大势所趋,如果你公司的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即可,需要重启VS,如下红字
"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.WindowsDesktop.App",
"version": "6.0.0"
},
然后就可以在控制台框架下愉快的开发表单界面了。
C#winform软件移植上linux的秘密,用GTK开发System.Windows.Forms的更多相关文章
- 【Winform】 无法将类型为“System.Windows.Forms.SplitContainer”的对象强制转换为类型“System.ComponentModel.ISupportInitialize”。
问题:将dotnet framework 4.0 切换到2.0时,编译没有问题,在运行时出现如下错误:System.InvalidCastException: 无法将类型为“System.Window ...
- 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子
客户端:先创建一个winform窗体的应用程序项目 项目结构
- winform软件版本检测自动升级开发流程(转)
注:按此博文试验OK 基于C/S的开发有开发效率高,对于业务逻辑复杂,且不需要外网使用具有较大优势,但是弊端也不可忽视,就是升级麻烦,不可能每写一个版本就要拿着安装包给每个人去替换,这样不仅搞得自己很 ...
- WinForm特效:桌面上的遮罩层
一个窗体特效,帮你了解几个windows api函数.效果:windows桌面上增加一个简单的遮罩层,其中WS_EX_TRANSPARENT 比较重要,它实现了鼠标穿透的功能. using Syste ...
- 使用用WCF中的双工(Duplex)模式将广告图片推送到每个Winform客户端机子上
参考资料地址:http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html 代码实现: WCF宿主(服务端) IServices.c ...
- winform 更新文件上传(一)
using Common; using DevExpress.XtraEditors; using FileModel.UpLoad; using System; using System.Colle ...
- 开发客户端软件时,出现System.Windows.Markup.XamlParseException错误
开发客户端软件时,出现System.Windows.Markup.XamlParseException错误,通过查看错误消息,发现TCPIP的一个COM组件在安装软件过程中被删除了,重新注册了一下TC ...
- 网站移植到linux上后常犯的错误
常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...
- 将DHT11移植到Linux系统上(转)
由于项目需要,需要将DHT11移植到Linux.驱动程序如下 #include <linux/kernel.h> #include <linux/module.h> #incl ...
- 通达OA2008从windows环境移植到linux部署手册
通达OA2008从windows环境移植到linux中(centos5.5及以上版本) OA系统拓扑图: 环境搭建(安装lamp环境) 1.安装xampp集成lamp包xampp-linux-1.6. ...
随机推荐
- ansible系列(21)--ansible的变量注册Register
1. 变量注册Register register 关键字可以将某个 task 任务结果存储至变量中,最后使用 debug模块 输出变量内容,可以用于后续排障: 示例一:register的基本使用: # ...
- JavaScript 数组常用方法整理
数组变异方法 push() 数组末尾添加一个项目,返回新数组长度,arr.push(item)pop() 数组末尾删除一个元素,返回被删除元素,arr.pop()shift() 删除数组开头第1个元素 ...
- 一个 .NET 开源的地图组件库 - Mapsui
前言 今天大姚给大家分享一个.NET开源(MIT License).免费.同时支持多平台框架(MAUI.WPF.Avalonia.Uno.Blazor.WinUI.Eto..NET Android 和 ...
- 批量处理图片(resize;grayscale)以及重命名
批量处理图片(resize:grayscale)以及重命名 做深度学习,有大量图片需要做为训练集,为方便批量resize,rename,灰度化,制作python脚本. 先纪录一些函数: resize ...
- nginx知识点汇总
- Linux和Windows时间不一致问题
问题描述 装过双系统或者虚拟机装Linux的人都知道,Linux的时间和Windows往往是不同步的,在编写跨平台程序的时候特别是对时间敏感的代码就带来很大的困扰 解决办法 这个问题可以在Linux下 ...
- Opencv笔记(12)傅里叶变换
在之前了解的OpenCV为我们实现的图像变换,这些本质上是从图像到输出图像的映射,即输入仍是一幅图像.本章的傅里叶变换,输出数组的值在含义上和原图像的强度值大不相同,是输入图像的频域表示. cv::d ...
- 8个实用的Java Streams API
分享8个开箱即用的API,方便日常处理集合. 1. 快速过滤空值:Stream.ofNullable 该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而可能使我们避免空指针异常. 在 ...
- pandas基础--数据结构:DataFrame
从本文开始介绍pandas的相关知识. pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas ...
- 状态管理(redux)
https://www.redux.org.cn/ 2013年 Facebook 提出了 Flux 架构的思想,引发了很多的实现.2015年,Redux 出现,将 Flux 与函数式编程结合一起,很短 ...