首页 > 系统相关 >转:在Linux上运行WinForm

转:在Linux上运行WinForm

时间:2024-07-01 13:08:40浏览次数:22  
标签:界面 ResourceManager System Resources ComponentResourceManager Linux GTKSystem 运行 

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网友的测试。

 

标签:界面,ResourceManager,System,Resources,ComponentResourceManager,Linux,GTKSystem,运行,
From: https://www.cnblogs.com/81/p/18277824

相关文章

  • linux内核 list_for_each_entry
    1.linux内核中的list用法在linus内核中,list一般这样使用:structlist_head{structlist_head*priv;structlist_head*next;}structxxx{intvalue;//结构体的真实成员structlist_head*lh;} 2.list遍历结构体xxx里面有structlist_head*lh......
  • 2024.7.1 初识Linux
    1、Linux安装:(1)VmwareWorkstation安装(2)Centos7系统安装(3)使用Mobaxterm远程操控Linux虚拟机2、Linux命令(1)ipaddress查看本机的ip地址(2)cal查看日历用法:cal[选项][[[日]月]年]选项:-1,--one只显示当前月份(默认)-3,--three显示上个月、当月和下......
  • Linux上的Vim编辑器教程
    当谈到Linux上的Vim编辑器时,以下是一个最全面的教程,涵盖了Vim的基本使用、模式、命令以及高级功能。一、Vim简介Vim(ViIMproved)是一个在Linux和其他类Unix系统上广泛使用的文本编辑器。它提供了一套强大的命令和快捷键,使用户能够高效地编辑文本。Vim有三种主要模式:正常模......
  • 在Linux中,某个账号登陆linux后,系统会在哪些日志文件中记录相关信息?
    当某个账号登录Linux系统后,其登录信息会被记录在几个关键的日志文件中,这些记录有助于系统管理员监控和审计系统活动。以下是主要涉及的几个日志文件及其用途:/var/log/secure或/var/log/auth.log:这个日志文件主要用于记录与系统认证相关的活动,包括成功的登录、失败的登录尝......
  • 在Linux中,有⼀个脚本运行时间可能超过2天,如何做才能使其不间断的运行,而且还可以随时观
    在Linux中,要确保一个脚本能够长时间运行而不被中断,并且可以随时观察其输出信息,可以采取以下步骤:使用nohup命令:nohup命令可以防止脚本在用户注销后被终止。使用nohup运行脚本时,它会忽略所有的挂断(HUP)信号。nohup/path/to/your/script.sh>output.log2>&1&这个命令会将脚......
  • 在Linux中,如何使用xargs和exec实现把当前目录下所有后缀名为.txt的⽂件的权限修改为77
    在Linux中,要使用xargs和exec结合find命令来批量修改当前目录下所有后缀名为.txt的文件权限为777,可以按照以下步骤操作:查找.txt文件:首先,使用find命令来查找当前目录及其子目录下的所有.txt文件。这里我们使用-name"*.txt"来指定查找的文件名模式。传递给xargs:然后,通过管......
  • 在Linux中,rsync 同步数据时,如何过滤出所有.txt的文件不同步?
    在Linux中,使用rsync命令同步数据时,若要过滤掉所有.txt文件,不将其纳入同步范围,可以通过--exclude选项来实现。具体做法如下:rsync-avz--exclude='*.txt'源目录/目标目录/这里对命令参数进行解释:-a或--archive:这是一个综合选项,等于-rlptgoD(递归、保留链接、保留权限、保......
  • 在Linux中,如何按照该要求抓包:只过滤出访问http服务的,目标ip为192.168.0.111,一共抓1000
    在Linux中,可以使用tcpdump工具来抓取网络包。根据你的需求,我们需要过滤出只访问HTTP服务的包,目标IP为192.168.0.111,并且只抓取1000个包,最后将这些包保存到1.cap文件中。以下是具体的步骤和命令:打开终端:首先,你需要打开Linux系统的终端。使用tcpdump命令:tcpdump是一个常用的......
  • linux下打满网卡的带宽和影响打满网卡的原因
     1.打满网卡带宽的定义网络传输场景很多,咱们这里用一个最常见的场景:客户端发送数据,服务端接收数据,所以这里给一个打满的定义:使用监控软件发现客户端的上行和服务端的下载带宽用满 2.测试软件客户端://ClientsideCprogramtodemonstrateSocket//programming#inc......
  • Linux Redis 服务设置开机自启动
    @目录前言一、准备工作二、操作步骤2.1修改redis.conf文件2.2创建启动脚本2.3设置redis脚本权限2.4设置开机启动2.5验证总结前言请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、提示:以下是本篇文章正文内容,下面案例可供参考一、准备工作注意:准备已安装好的Re......