国产系统大势所趋,如果你公司的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的更多相关文章

  1. 【Winform】 无法将类型为“System.Windows.Forms.SplitContainer”的对象强制转换为类型“System.ComponentModel.ISupportInitialize”。

    问题:将dotnet framework 4.0 切换到2.0时,编译没有问题,在运行时出现如下错误:System.InvalidCastException: 无法将类型为“System.Window ...

  2. 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子

    客户端:先创建一个winform窗体的应用程序项目 项目结构

  3. winform软件版本检测自动升级开发流程(转)

    注:按此博文试验OK 基于C/S的开发有开发效率高,对于业务逻辑复杂,且不需要外网使用具有较大优势,但是弊端也不可忽视,就是升级麻烦,不可能每写一个版本就要拿着安装包给每个人去替换,这样不仅搞得自己很 ...

  4. WinForm特效:桌面上的遮罩层

    一个窗体特效,帮你了解几个windows api函数.效果:windows桌面上增加一个简单的遮罩层,其中WS_EX_TRANSPARENT 比较重要,它实现了鼠标穿透的功能. using Syste ...

  5. 使用用WCF中的双工(Duplex)模式将广告图片推送到每个Winform客户端机子上

    参考资料地址:http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html 代码实现: WCF宿主(服务端) IServices.c ...

  6. winform 更新文件上传(一)

    using Common; using DevExpress.XtraEditors; using FileModel.UpLoad; using System; using System.Colle ...

  7. 开发客户端软件时,出现System.Windows.Markup.XamlParseException错误

    开发客户端软件时,出现System.Windows.Markup.XamlParseException错误,通过查看错误消息,发现TCPIP的一个COM组件在安装软件过程中被删除了,重新注册了一下TC ...

  8. 网站移植到linux上后常犯的错误

    常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...

  9. 将DHT11移植到Linux系统上(转)

    由于项目需要,需要将DHT11移植到Linux.驱动程序如下 #include <linux/kernel.h> #include <linux/module.h> #incl ...

  10. 通达OA2008从windows环境移植到linux部署手册

    通达OA2008从windows环境移植到linux中(centos5.5及以上版本) OA系统拓扑图: 环境搭建(安装lamp环境) 1.安装xampp集成lamp包xampp-linux-1.6. ...

随机推荐

  1. WEB服务与NGINX(24)- LNMP架构部署wordpress

    目录 1. LNMP架构项目实战 1.1 LNMP架构介绍 1.2 LNMP架构部署wordpress 1.2.1 LNMP环境介绍 1.2.2 二进制部署mariadb 1.2.3 部署php-fp ...

  2. 2D空间中比较两三角形相交与包含

    在处理UV重叠.CPU的ZFighting检测时会遇到2D空间中的三角形相交问题, 网上普遍是3D空间的相交解法,因此写本文研究下,不过虽然实现了需求, 但用的方法比较暴力. 效果如图: (鼠标拖动区 ...

  3. 2023年Clion插件推荐

    目录 搜素位置 插件 background-image plus 背景图片插件 Rainbow Brackets 彩虹括号 Xcode-Dark Theme 界面主题 Grep Console 日志颜 ...

  4. DashVector x 通义千问大模型:打造基于专属知识的问答服务

    本教程演示如何使用向量检索服务(DashVector),结合LLM大模型等能力,来打造基于垂直领域专属知识等问答服务.其中LLM大模型能力,以及文本向量生成等能力,这里基于灵积模型服务上的通义千问 A ...

  5. linux常用关机/重启命令:shutdown,init 0,init 6

    目录 一.使用shutdown关机,重启,定时关机 二.使用init关机/重启 一.使用shutdown关机,重启,定时关机 1.设置计算机10分钟之后关机 [root@node5 ~]# shutd ...

  6. 开源项目分享:ChatGPT 控制台聊天应用

    开源项目分享:ChatGPT 控制台聊天应用 分享一个我最近完成的一个小应用,一个ChatGPT 的控制台聊天应用,大家都在搞AI,我也来玩一玩,顺便分享到社区,有兴趣的小伙伴可以去我的github主 ...

  7. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤)

    1. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤) @ 目录 1. Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤) 每博一文案 2. 大概的实现步骤概 ...

  8. Gitea 代码仓库平台

    引言 Gitea 是一个自己托管的 Git 服务程序.他和 GitHub,Bitbucket or Gitlab 等比较类似.它是从 Gogs 发展而来,不过它已经 Fork 并且命名为 Gitea. ...

  9. cmd shutdown命令:关机,重启,休眠

    一段时间后关机:shutdown -s -t 秒数效果是倒计时到该秒数后关机,例如shutdown -s -t 3600就是3600秒后关机,也就是一小时后关机 立即关机命令:shutdown -p关 ...

  10. 微信小程序设置swiper圆角在ios上失效

    今天在给轮播图添加圆角的时候,发现在安卓机上是有圆角的,但是在苹果手机上圆角却失效了,后来翻阅了文档发现这是个官方的bug 解决方法1 border-radius: 20rpx; /*再设置个tran ...