C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发

这篇具有很好参考价值的文章主要介绍了C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景:

微软的.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开发界面:

C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发

运行效果:

C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发

 统信系统上运行效果:

C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发

最后:

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

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

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

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

 更新补充:

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

C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发

 文章来源地址https://www.toymoban.com/news/detail-711346.html

到了这里,关于C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Form表单开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它

    2024年01月22日
    浏览(45)
  • 【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    RasterLite2是一个开源的轻量级栅格数据库,可以用于存储和管理各种类型的栅格数据,包括卫星遥感图像、数字高程模型等。 与传统的GIS数据存储方式不同,RasterLite2采用基于SQLite的数据库引擎,支持快速的数据查询和空间分析操作。同时,由于其轻量级的设计,RasterLite2可以

    2024年02月19日
    浏览(48)
  • 跨平台编译go(交叉编译)

    以将一个简单的go http 部署到docker为例! Dockerfile文件 docker build . -t goweb_app docker run -p 8888:8888 goweb_app 在最终的镜像中是不需要go编译器的,也就是说只需要一个运行最终二进制文件的容器即可。 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序。 golang中跨平台

    2024年02月07日
    浏览(71)
  • Docker多平台、跨平台编译打包

    大多数带有Docker官方标识的镜像都提供了多架构支持。如:busybox镜像支持 amd64 ,  arm32v5 ,  arm32v6 ,  arm32v7 ,  arm64v8 ,  i386 ,  ppc64le , and  s390x。 当你在amd64设备上运行容器时,会拉取amd64镜像。 当你需要构建多平台镜像时,可以用 --platform 参数指定目标平台,但是通常情况下

    2024年02月06日
    浏览(59)
  • ffmpeg跨平台arm编译-ubuntu

    32位系统: 64位系统: 关键选项: –arch=arm:指定ARM平台 –target-os=linux:指定Linux系统 –enable-cross-compile :指定交叉编译 –cross-prefix=arm-linux-gnueabihf-:指定交叉编译链 如果是64位系统: –arch=aarch64:指定ARM平台 –cross-prefix=aarch64-linux-gnu-:指定交叉编译链

    2024年02月08日
    浏览(43)
  • rust包跨平台编译,macbook ,linux

    在 MacBook 上编译 Rust 项目并生成 Linux 包需要一些步骤。以下是一般的步骤概述: 1. **安装所需工具:**    首先,确保您的 MacBook 上已经安装了所需的工具。您需要 Rust 编程语言的工具链以及一些用于交叉编译到 Linux 的工具。    - 安装 Rust 工具链:您可以在终端中运行以下

    2024年02月12日
    浏览(46)
  • Windows平台visual studio与树莓派跨平台交叉编译opencv

    由于架构差异,opencv在Windows平台下编译的程序无法直接移植到树莓派环境使用,所以需要进行Cmake和跨平台的交叉编译。网上包括官方文档很多足够参考,但配置过程中依然会出现个性问题,以下是本人基于windows下使用visual studio2017集成开发环境进行交叉编译环境配置过程中

    2024年04月11日
    浏览(36)
  • 在Linux、Ubuntu中跨平台编译ARM(AARCH64)平台的binutils

    Binutils 是GNU(https://www.gnu.org/)提供的一组二进制工具的集合。通常,在已经安装了Linux操作系统的个人电脑上,系统就已经自带了这个工具集。但在进行嵌入式开发的时候,可能会用到支持ARM64平台的Binutils,这时就需要用到交叉编译。 此前,在【1】我们已经介绍过Ubuntu中交

    2024年02月05日
    浏览(61)
  • 前端(五)——从 Vue.js 到 UniApp:开启一次全新的跨平台开发之旅

    🙂博主:小猫娃来啦 🙂文章核心:从 Vue.js 到 UniApp:开启一次全新的跨平台开发之旅 UniApp是一种基于Vue.js的跨平台应用开发框架。它是 由DCloud(数字天堂)开发和维护 的,旨在帮助开发者使用一套代码构建同时运行在多个平台(包括iOS、Android、Web等)的应用程序。 UniA

    2024年02月16日
    浏览(62)
  • 「C/C++」C/C++软件跨平台思维

    博客主页:何曾参静谧的博客 文章专栏:「C/C++」C/C++学习 跨平台思维: 是指在软件开发过程中,考虑到不同操作系统和软/硬件平台的特点和要求,使得开发出的软件能够在多个平台上运行,提高软件的适配性和可移植性。 编写可移植的C++代码是实现跨平台的关键。开发人

    2024年02月01日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包