前言

MWGA,是 Make Winforms Great Again 的缩写,是一个帮助 WinForms 程序快速迁移到 Blazor WASM 平台的高效工具软件。近期,我们借助 MWGA 成功将一个约 7 万行 C# 代码的成熟商业 WinForms 程序迁移至 Web 前端,整个过程快速且代码改动量极小,验证了其在复杂项目迁移中的不可思议的迁移能力。本文将以该案例为基础,概述迁移的核心思路与显著成果。

案例程序说明

本次迁移的对象是一款面向医院行业的商业软件——“时间轴”,主要用于患者体温单曲线图、跨机构居民健康档案数据可视化、手术室排程及住院患者数据分析。该软件功能复杂,紧密贴合医疗临床需求,具有以下特点:

  • 1.代码量大:总计约 7 万行 C# 代码,其中包含近 4 万行与文档排版和 GDI+ 绘图相关的核心逻辑。
  • 2.界面复杂:实现了可交互的时间轴、动态区域展开/收缩、超链接文本、多数据层叠加(如血压曲线、疼痛指数、用药记录)等高级可视化功能。
  • 3.市场验证:已在国内及台湾地区的多家医院稳定部署使用,是一个经过实践检验的成熟产品。 这是用来展示跨医疗机构的居民健康档案数据的展示界面:

这个界面很复杂,将门诊、社区医院、住院、手术等数据串联在一起,形成不同的时间区域,时间区域可以展开和收缩,里面还有超连接文本。用户可以点击左边的坐标尺来显示和隐藏线条,当体温值过高和过低时会有小箭头并伴随纵向文本。

下图是医院内部手术室排程的界面,白色区域是已经开始的手术,灰色区域是计划中的手术,红色块表示发生意外的手术。

这个软件产品还卖到台湾医院了,下图为台湾医院中的住院患者数据展示界面,这里的阴影区域,上边缘是血压的收缩压,下边缘是舒张压,还有一个红色折线表示疼痛指数,上面的表格显示了住院时间,下面的表格显示了用药情况,可以明确展示出用药和血压及疼痛指数之间时间上的先后关系。

这个软件紧密贴合医院临床需求,功能强大,是一个经过市场考验的软件产品。

迁移过程与成果

借助 MWGA,我们以极低的成本完成了这个庞大项目的 Web 化迁移。整个过程遵循高度标准化的流程,核心环节如下:

第一,创建项目

使用VS.NET2022创建一个Blazor WASM9.0的项目。并将原有 WinForms 项目的全部源代码与资源文件复制其中,包括C#代码文件、Form.Designer.cs、Form.resx文件。

第二,引用MWGA程序集

仅需引用一个独立的 DCSoft.MWGA.dll 程序集(约 4MB),即可获得完整的 WinForms 到 WebAssembly 的运行时支持

第三,配置应用入口

通过MWGA提供的标准化引导模式,在Blazor应用中快速建立WinForms应用的运行环境。只需在HTML页面中添加一个指定的容器元素并进行简单配置,即可将WinForms主窗体启动并渲染于该容器内。

第四,适配性调整C#代码

针对 Web 环境与桌面环境的差异(WEB前端编程相对于WinForms编程最大的差异就是异步编程模式),我们对少量代码进行了适配性修改,主要集中在异步化改造方面(例如文件对话框的调用),以确保在浏览器中的流畅交互。绝大部分业务逻辑、界面布局和 GDI+ 绘图代码均无需改动。

案例程序中的其他代码不需要动,比如几万行的文档排版和绘图代码就不需要修改,例如:


if (text == null) {     // 否则只显示日数     text = dtm.Day.ToString(this.Config.DateFormatString); } fullWidth = g.MeasureString(text, txtFont, 10000, centerFormat).Width; if (rect2.Width < fullWidth) {     rect2.X = rect2.X - (fullWidth - rect2.Width) / 2;     rect2.Width = fullWidth; } //////////////////////////////////////////////////////////////////////// if (clipRectangle.IntersectsWith(rect2)) {     Color tc = line == null ? this.Config.ForeColor : line.TextColor;     tc = line != null && line.BlankDateWhenNoData == true && this._NoDataInDocument == true ? Color.Transparent : tc;     g.DrawString(         text,         txtFont,         GetRuntimeForeColor(tc),         rect2,         centerFormat); }

第五,处理资源文件

借助MWGA提供的资源管理兼容方案,原有的.resx文件及其在Designer.cs中的初始化代码可被自动识别和处理,无需手动修改。

例如WinForms程序会使用Forms.resx文件来存储窗体中使用到的资源,包括字符串或者图片。只需要添加几行代码,就借助MWGA实现了无缝资源迁移。

第六,测试与成果展示

完成上述步骤后,项目可直接编译为 Blazor WASM 应用。我们在多个平台和浏览器中进行了测试,均获得一致且良好的运行效果。

经过迁移,这款 7 万行代码的 WinForms 应用成功转变为可通过浏览器直接访问的 Web 应用,并在不同环境下展现了出色的兼容性:

在谷歌浏览器中运行界面如下所示:

在FireFox中运行的效果:

在iPad中的运行效果如下:

在安卓平板中的运行效果如下:

该软件在统信操作系统中的运行效果如下:

迁移后的 Web 应用完整保留了原桌面版的所有交互逻辑和界面效果,包括复杂的 GDI+ 绘图、鼠标拖拽、点击响应等行为,用户体验与原生版本高度一致。

 

结论与价值

本次迁移工作验证了以下结论:

  • 1.修改量极低:面对 7 万行代码,仅对不足 1% 的代码进行了必要的适配性调整,核心业务逻辑与绘图代码得以完全复用。相较于重写或采用其他迁移方案,基于MWGA的改造成本几乎可以忽略不计。
  • 2.功能完整迁移:复杂的用户界面和交互行为被高保真还原至Web前端。
  • 3.真正的跨平台:生成的应用可无缝运行于 Windows、Linux、Android、iOS 及统信 UOS、麒麟等国产操作系统的现代浏览器中。
  • 4.双线发展:借助MWGA和条件编译等技术手段,可以让同一份C#代码同时编译成 .exe 和 .wasm文件,让开发组织用较低的成本同时维护一个软件的Windows桌面版和WEB前端版。让软件产品适应更多的应用场景,为客户系统的平滑升级争取更多的时间。
  • 5.信创适配:对于中国的开发者,MWGA能将基于MS Windows的WinForms程序快速迁移到跨平台的WEB前端,大量软件产品有望躲过信创的斩杀线。

当然WinForms程序不仅仅是UI控件和GDI+,还有很多其他的操作,比如连接数据库、访问本地文件、连接硬件设备等等,而MWGA运行在WEB浏览器沙盒中,没有能力完整的复现WinForms的全部功能集。但是MWGA的设计目标也不是解决所有的问题,单单是解决UI和GDI+的功能迁移问题就足以创造巨大的价值。

MWGA可以说创造了一个WEB前端框架,但是采用了WinForms编程模型。这是一种跨界融合,使得WinForms开发者无需更换技术栈即可参与WEB前端开发。同时,C#的强类型特性与GDI+严谨的编程模型也有助于减少AI编程产生的隐形BUG。

全球数百万开发者过去20年在WinForms技术栈上投资巨大,可能过千亿美元,在云原生成为主流的今天,这些资产常被视为“沉没成本”,让成千上万的企业CTO倍感纠结。而MWGA有望盘活这些“沉没资产”,它率先探索出一条全新的技术路径,随着该路径的不断成熟,有望为全球WinForms技术栈延寿数年,可能会对全球的企业级软件研发领域带来不小的震荡。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐