转:在Linux上运行WinForm

news/2024/7/7 21:03:06/文章来源:https://www.cnblogs.com/81/p/18277824

C#winform软件实现一次编译,跨平台windows和linux、mac兼容运行,兼容Visual Studio原生界面Form表单开发 - 亲善美 - 博客园 (cnblogs.com)

 

一、背景:

微软的.net core开发工具,目前来看,winform界面软件还没有打算要支持linux系统下运行的意思,要想让c#桌面软件在linux系统上运行,开发起来还比较麻烦。微软只让c#的控制台软件支持在linux运行。

二、解决方案:

我想到的一个方案是自定义封装软件的System.Windows.Forms组件,把支持windows和linux的界面框架GTK封装进System.Windows.Forms中!

这个方案有两个特点:

1、兼容原生C#表单控件,原c#软件不需要重新开发,换成该组件重新编译即可

2、可以使用Visual Studio可视化开发,不需要学习框架,引用DLL即可

三、组件封装

这个System.Windows.Forms是实现C#界面的关键组件,Form界面的所有控件都封装在这个组件里。在.net core环境里,这个组件在框架Microsoft.WindowsDesktop.App.WindownsForms下。当开发工程的输出模式是“windows应用程序”时,就会自动引用Microsoft.WindowsDesktop.App.WindownsForms,如果开发工程的输出模式是“控制台应用程序”时,工程不会引用Microsoft.WindowsDesktop.App.WindownsForms,也无法开桌面软件的界面。

为了兼容VS原生界面表单开发,我开发了这个组件GTKSystem.Windows.Forms,这个组件的控件类库命名空间和类名称沿用了原生System.Windows.Forms的类库名称,可以在原生开发的C#软件工程里,直接引用GTKSystem.Windows.Forms就能兼容运行。

四、技术开发

目前实现的控件:Form、Button、CheckBox、CheckedListBox、ComboBox、DataGridView、DateTimePicker、GroupBox、Label、LinkLabel、MaskedTextBox、MenuStrip、MonthCalendar、NumericUpDown、Panel、PictureBox、RadioButton、RichTextBox、SplitContainer、SplitterPanel、TabControl、TextBox、TreeView

实现的窗口组件:MessageBox、ColorDialog、OpenFileDialog、SaveFileDialog、FolderBrowserDialog

以上控件都只实现了常用功能的属性和方法,事件主要实现了鼠标事件、验证事件、加载事件,还有很多平常不用的属性事件已经实现了接口,但是没有实现执行功能,主要是因为程序量太多,没有去做。对于有能力的开发人员,组件也是可以拿到相关的属性事件(如WidgetEvent)去实现需要的功能。

重写的类也很多,重点说一下这几个类:Bitmap、Image、System.ComponentModel.ComponentResourceManager、System.Resources.ResourceManager。这几个类是Form界面引用图像资源必需的。在控制台程序架构里,是没有Bitmap、Image类库的,而且ComponentResourceManager和ResourceManager都不能读取资源图像数据。我在GTKSystem.Windows.Forms里封装实现了Bitmap和Image类,实现了ComponentResourceManager和ResourceManager读取资源图像数据。

Bitmap和Image类除了常用属性外,新增属性Image.PixbufData存放图像数据,用于GTKSystem的使用。

ComponentResourceManager和ResourceManager主要是实现了GetObject方法,读取资源数据。

五、使用方法

修改.net core的windows应用程序工程属性,把输出类型改为“控制台应用程序”,或者把windows窗体配置勾选去掉,配置变为<UseWindowsForms>false</UseWindowsForms>。

<PropertyGroup>
<OutputType>WinExe</OutputType>
<UseWindowsForms>false</UseWindowsForms>
</PropertyGroup>

1、新建System.Resources.ResourceManager类
在项目下新建System.Resources.ResourceManager类,继承GTKSystem.Resources.ResourceManager,用于覆盖原生System.Resources.ResourceManager类。
GTKSystem.Resources.ResourceManager实现了项目资源文件和图像文件读取。
如果项目里没有使用资源图像文件,可以不用新建此文件。

2、新建System.ComponentModel.ComponentResourceManager类
在项目下新建System.ComponentModel.ComponentResourceManager类,继承GTKSystem.ComponentModel.ComponentResourceManager,用于覆盖原生System.ComponentModel.ComponentResourceManager类。
GTKSystem.ComponentModel.ComponentResourceManager实现了项目资源文件和图像文件读取(调用GTKSystem.Resources.ResourceManager)。
如果项目里没有使用资源图像文件,可以不用新建此文件。

3、GTKWinFormsApp.csproj
配置UseWindowsForms为false,或者使用控制台应用程序
<UseWindowsForms>false</UseWindowsForms>

4、引用GTKSystem.Windows.Forms、System.Resources.Extensions
System.Resources.Extensions是空程序dll,VS加载Form界面时验证需要此dll.

5、GTKWinFormsApp\obj\Debug\netcoreapp3.1\GTKWinFormsApp.designer.runtimeconfig.json
GTKWinFormsApp\obj\Release\netcoreapp3.1\GTKWinFormsApp.designer.runtimeconfig.json
将name设置为Microsoft.WindowsDesktop.App,用于VS支持在窗体设计器上可视化Form表单,重新加载工程或重启VS(使用这个配置在VS窗体设计器上打开form表单时,调试切换会变慢,因为有个加载时间,建议在不开发界面时,关闭窗体设计器上的form界面!)
"runtimeOptions": {
"framework": {
"name": "Microsoft.WindowsDesktop.App"
},

六、使用效果:

VS开发界面:

运行效果:

 统信系统上运行效果:

最后:

此程序在统信系统(linux)上测试完美运行,实现一次编译,跨平台运行,显示界面样式与windows上运行的显示效果基本一样。

目前这个组件没有完全完成,但是主要功能和技术难点都已经解决,现公布出来给有需要的开发人员参考。

gitee开源项目地址:https://gitee.com/easywebfactory/gtksystem-windows-forms

更新日志:https://www.cnblogs.com/easywebfactory/p/17803567.html

 更新补充:

经测试,此方案也可以兼容mac平台运行,所以是可以支持windows、linux、mac平台运行的。感谢@Sheepherder网友的测试。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/735736.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

固件的烧录以及部分PCB基础

固件 固件的基础定义: 固件(firmware)一般存储于设备中的电可擦除只读存储器(允许用户通过特定的电子方式复写存储内容,在【工作情况下是只读的,并且关闭电源仍存储数据)EEPROM(Electrically Erasable Programmable ROM)或FLASH芯片中,一般可由用户通过特定的刷新程序进…

Golang:go-querystring将struct编码为URL查询参数的库

Golang:go-querystring将struct编码为URL查询参数的库 原创 吃个大西瓜 Coding Big Tree 2024-05-09 08:30 北京go-querystring is a Go library for encoding structs into URL query parameters.译文:go-querystring 将struct编码为URL查询参数的Golang库文档https://pkg.g…

C#之缓存

原文链接:https://zhuanlan.zhihu.com/p/657458522 缓存指在中间层中存储数据的行为,该行为可使后续数据检索更快。 从概念上讲,缓存是一种性能优化策略和设计考虑因素。 缓存可以显著提高应用性能,方法是提高不常更改(或检索成本高)的数据的就绪性 既然缓存是是一种性能…

有关paddleocr在pyinstall中打包问题的解决方案

借鉴网址python解决paddleocr打包问题_pyinstaller怎么解决paddleocr中的动态导入-CSDN博客 在打包时我使用的spec文件如下:(需要将pathe和binaries换为自己的paddleocr路径) block_cipher = Nonea = Analysis([main.py], pathex=[E:\\PyEnviroment\\Lib\\site-packages…

初始docker

前置知识 通过面向对象的知识来了解docker中的镜像和容器就很好理解了,docker是C/S架构镜像:是一个只读的模板,可以用来创建容器。类容器:是docker的运行实例,提供了一个独立的可移植的环境,可以在这个环境中运行应用程序。实例,1个或多个docker仓库:用来存储docker镜像…

【日记】度过了一个堕落的周末……(184 字)

正文昨天睡了一天觉,今天看了一天《三体》电视剧。真是堕落到没边了呢(笑。本来想写代码完成年度计划,或者多写几篇文章,但实在不想写,也不想动笔。感觉这个周末什么都没做呢,休息倒是休息好了。今天 30 号,也不知道灵平安到学校没有。本有一些想写的东西,但懒得动笔了…

BigCodeBench: 继 HumanEval 之后的新一代代码生成测试基准

HumanEval 是一个用于评估大型语言模型 (LLM) 在代码生成任务中的参考基准,因为它使得对紧凑的函数级代码片段的评估变得容易。然而,关于其在评估 LLM 编程能力方面的有效性越来越多的担忧,主要问题是HumanEval 中的任务太简单,可能不能代表真实世界的编程任务。相比于 Hum…

window 下 pyenv 安装与使用

安装 GitHub上下载这个文件 https://github.com/pyenv-win/pyenv-win 点击这个 下载到本地解压文件并且重命名为> pyenv 并放置到合理位置添加环境变量 ...\pyenv-win\bin ...\pyenv-win\shims添加完成之后执行如下命令验证 pyenv --versionpyenv的基本命令 查看支持的pytho…

RabbitMQ如何备份与恢复数据

阅读目录一、场景 二、元数据备份和还原1、操作 2、导出数据3、导入数据 4、验证数据 三、消息数据备份和还原1、确定数据目录 2、为避免数据的一致性,需先停掉服务 3、备份数据目录4、还原数据 5、修改数据目录权限 6、启动B服务器上rabbitmq服务 7、验证消息数据是否还原成功…

Codeforces Round 918 G. Bicycles (二维最短路)

G. Bicycles题意:在一个无向图里你要从1点到达n点,每条路的路径长度是该路的权值乘于你当前的慢度因子。而在每个点上我们都有一个慢度因子可以进行更换,问你到达n点所需要的最短时间。 思路:我们很容易想到每次遇到更小的慢度因子我们就要更换,但因为存在你先去绕远路拿更…

中电金信:银行业私有云何去何从

​2009年,云计算开始从概念走向实践。在这一年,Gartner在预测2010十大发展趋势中,将云计算列在榜首。在这之后,谷歌、亚马逊、IBM等科技巨头纷纷加码对云计算的研发投入。2010年正式迎来云计算时代,这一年也被定为“云元年”。2013年4月,2013中国国际云计算技术和应用展览…

使用GCOV和LCOV测试C++代码覆盖率

使用GCOV和LCOV测试C++代码覆盖率 目录使用GCOV和LCOV测试C++代码覆盖率1. GCOV和LCOV简介2. GCOV和LCOV安装3. GCOV+LCOV测试代码覆盖率 1. GCOV和LCOV简介 GCOV是一个测试代码覆盖率的工具,可以与GCC一起使用来分析程序,以帮助创建更高效、更快的运行代码,并发现程序的未测…

springboot异常解决

Circular view path [test]: would dispatch back to the current handler URL [/interceptor/test] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)] with root cause问题解决 问题解释…

uniapp+thinkphp5实现微信登录

之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixi…

用免费可视化工具做智慧城市,一屏实现城市统筹管理

在智慧城市的建设中,实现高效的统筹管理是至关重要的。通过免费可视化工具“山海鲸可视化”,这一目标可以轻松达成。山海鲸可视化是一款免费可视化工具,具备二三维融合、易用性、安全性以及高质量画面渲染等特色,是制作智慧城市可视化大屏的理想选择。山海鲸可视化的二三维…

【论文阅读】Position: What Can Large Language Models Tell Us about Time Series Analysis

原始题目:Position: What Can Large Language Models Tell Us about Time Series Analysis 中文翻译:立场:关于时间序列分析,大型语言模型能告诉我们什么 发表时间:2024-06-01 平台:ICML 文章链接:http://arxiv.org/abs/2402.02713 开源代码:NA摘要 时间序列分析对于理…

TDA4与Openvx技术开发示例

TDA4与Openvx技术开发示例 [TI TDA4 J721E]基于TDA4平台 FFmpeg / X264 的ARM平台移植 https://blog.csdn.net/AIRKernel/article/details/121483611 创建了开源的Demo演示案例库,后续会把Demo代码放到这个Gitee库里:TDA4/TI TDA4 https://gitee.com/tda4/ti-tda4欢迎大家加入…

遇到的线上问题之“动态数据源报错-recyle error java.lang.InterruptedException”

Druid出现DruidDataSource - recyle error - recyle error java.lang.InterruptedException: null异常排查与解决 一、线上的代码之前运行的都很平稳,突然就出现了一个很奇怪的问题,看错误信息是第三方框架Druid报出来了,连接池回收连接时出现的问题。[][ERROR][2024-07-01 …

遇到的线上问题之“recyle error java.lang.InterruptedException”

Druid出现DruidDataSource - recyle error - recyle error java.lang.InterruptedException: null异常排查与解决 一、线上的代码之前运行的都很平稳,突然就出现了一个很奇怪的问题,看错误信息是第三方框架Druid报出来了,连接池回收连接时出现的问题。[][ERROR][2024-07-01 …

构建高可用性、高性能和可扩展的Zabbix Server架构

简介 本教程讲解了一下如何设计构建一个高性能、高可靠、高扩展的Zabbix 监控集群。 架构图 架构图PDF下载: https://songxwn.com/file/Zabbix_HA.pdfPigsty 时序数据库集群 Zabbix Server 和 Grafana的数据都是存放在数据库的,而Zabbix性能很大程度取决于数据库。所以要搭建…