首页 > 系统相关 >C#winform软件实现一次编译,跨平台windows和linux、mac兼容运行

C#winform软件实现一次编译,跨平台windows和linux、mac兼容运行

时间:2024-08-21 21:54:06浏览次数:9  
标签:ResourceManager C# mac System windows 跨平台 ComponentResourceManager GTKSystem Res

一、背景:

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

 

 

2024-08-21 21:56:32【出处】:https://www.cnblogs.com/easywebfactory/p/17790016.html#!comments

=======================================================================================

标签:ResourceManager,C#,mac,System,windows,跨平台,ComponentResourceManager,GTKSystem,Res
From: https://www.cnblogs.com/mq0036/p/18372634

相关文章

  • delphi webbrowser屏蔽右键菜单 防止右键 防止ctrl N
    本文介绍了如何在Delphi中通过事件处理和消息过滤,阻止WebBrowser控件中的右键菜单以及防止用户使用Ctrl+N快捷键。通过`ProcessMsg`和`ApplicationEvents1Message`等方法实现对浏览器行为的控制。{关键字=webbrowser屏蔽右键菜单防止右键防止ctrlN采集软件=MKM-我的知识管理......
  • abc366_f
    思路考虑\(dp\),那么我们就需要装压\(dp\),所以我们考虑是否可以通过改变拓扑序,来让题目变成我们熟悉的背包\(dp\),所以我们来思考一下,什么时候交换顺序反而更优?考虑\(i\)和\(i+1\),那么如果为\(f_{i+1}(f_i(x))\)那么贡献为:\(a_{i+1}(a_{i}x+b_{i})+b_{i+1}\)如果交换......
  • CF889E题解
    \(\text{Problem-889E-Codeforces}\)\(\text{*3000}\)题意给一个序列,对于一个非负整数\(x\),有一个式子:\[x\bmoda_1+x\bmoda_1\bmoda_2+...+x\bmoda_1\bmoda_2...\bmoda_n\]求出上式的最大值。思路先去寻找题目的性质。首先\(x\)的值单调不增,然后如果当前\(x......
  • YSP_refs_cn_2010_SpA
    rhTNFR-Fc中文文献-2010-SpA 脊柱关节炎 随机对照试验[1–11][1]陈慕芝,照日格图,王海云,等.重组人Ⅱ型肿瘤坏死因子受体-抗体融合蛋白与传统免疫抑制剂治疗强直性脊柱炎的临床对照研究.新疆医科大学学报,2010,33(8):913-915.浏览文摘[2]冯艳广,王俊丽,王慧......
  • AT_joisc2017_c 手持ち花火
    AT_joisc2017_c手持ち花火一道神秘贪心题。首先显然是二分速度\(v\)。然后发现题意可以被理解成其他人逐渐向\(k\)靠近,所以若跑了区间\([l,r]\),那么跑的距离就是\(x_r-x_l\),所以就要尽量增长跑动的时间,而注意到题意不是一碰到就要点燃,所以可以跟着跑,也就是说时间就是......
  • pgsql登录不上,psql: error: connection to server on socket "/var/run/postgresql/.s
    背景在ubuntu上安装postgres,发现不能直接登录。分析默认是linux系统上的某个对应的用户才能使用对应的pg数据库的用户,因此我们需要作修改。解决编辑以下路径对应的文件,此处的14是版本,不知道的cd过去看看就行了。/etc/postgresql/14/main/pg_hba.conf将下图中对应位置改成m......
  • 040、Vue3+TypeScript基础,使用nanoid库生成id
    01、使用powershell,输入npminanoid来安装: 02、App.vue代码如下:<template><divclass="app"><h2class="title">App.Vue</h2><Page1/><br><Page2/></div></template><......
  • 『模拟赛』暑假集训CSP提高模拟26
    Rank打得一般,倒数第二场了。。A.博弈直接搬了牛客的一套题。一眼没思路,模了一会放弃直接去打T2了,后来把\(\mathcal{O(n^2)}\)暴力打了拿30pts。正解用到了异或哈希。首先确定合法的数量即为总对数\(\frac{n(n-1)}{2}\)减去不合法的数量,而比较显然的,不合法的判断......
  • C#联合halcon实现connection后的物料上色、物料计数、物料框选
    一、效果预览二、实现步骤三、代码部分ReadImageThresholdHalconWindowShowImageRectangleDef类库GenRectanglepublicstaticvoidGenRectangle(HObjectRegion,outHObjectExternalRegion,outRectangleDefrectangleDef,boolisMargin,HWindowhWindow)......
  • 【TCP】核心机制:滑动窗口、流量控制和拥塞控制
    文章目录滑动窗口窗口滑动滑动窗口丢包流量控制拥塞控制窗口大小变化过程滑动窗口有一类算法题,就是通过滑动窗口的思想来解决的,算法中的“滑动窗口”借鉴自TCP的滑动窗口TCP是要保证可靠传输的==>代价,降低了传输的效率(重传,确认重传等操作)TCP希望能在可靠传输......