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. ...
随机推荐
- C语言:冒泡排序---详细解释
//冒泡排序数字,仅仅适用于数组无序的时候,若有序则不能使用冒号排序 例如: 数字组:5,54,64,98,47 /* 1: 54,64,98,47,5 4次 ...
- Pageoffice6 实现后台批量生成PDF文档
在实际项目开发中经常会遇到批量后台动态生成PDF文档的需求,目前网上有一些针对此需求的方案,如果您想要了解这些方案的对比,请查看后台生成单个Word文档中的"方案对比". 如果一次 ...
- Machine Learning - 梯度下降
一.梯度下降:目的是为了寻找到最合适的 $w$ 和 $b$ ,让成本函数的值最小 \[w = w - α\frac{\partial J(w,b)}{\partial w} \] \[b = b - ...
- pod(三):pod的管理
目录 一.系统环境 二.前言 三.pod的管理 3.1 环境介绍 3.2 管理pod 一.系统环境 服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.17 ...
- 推荐2款开源、美观的WinForm UI控件库
前言 今天大姚给大家分享2款开源.美观的WinForm UI控件库,希望可以帮助到有需要的同学. WinForm介绍 WinForm是一个传统的桌面应用程序框架,它基于 Windows 操作系统的原生 ...
- .NET 将多个程序集合并成单一程序集的 4+3 种方法
将 .NET 程序集与依赖合并到一起的方法有下面四种: 使用 .NET Core 3.0 自带的 PublishSingleFile 属性合并依赖使用 Fody使用 SourceYard 源代码包使用 ...
- iOS 处理HLS视频流
一.HLS介绍 HLS是苹果主导的音视频传输协议,其主要的格式是一个索引文件(M3U8)+ ts分片的视频文件. HLS的优势是iOS系统天然支持,通过Http 80传输,规避了常规的防火墙问题. 视 ...
- 【AI应用开发全流程】使用AscendCL开发板完成模型推理
本文分享自华为云社区<[昇腾开发全流程]AscendCL开发板模型推理>,作者:沉迷sk. 前言 学会如何安装配置华为云ModelArts.开发板Atlas 200I DK A2.并打通一 ...
- mvn 打包报错:no compiler is provided in this environment
最近公司换了电脑,系统也从 win7 升级到 win11,开发环境都重新安装了一遍,然后在 idea 用mvn 执行打包命令 mvn clean package 报错: no compiler is ...
- webpack externals忽略不打入的包
例如项目中使用从 CDN 引入 jQuery,而不是把它打包进来使用 import $ from 'jquery' webpack.config.js externals: { jquery: 'jQ ...