把桌面应用部署从三天压缩到三分钟:Windows桌面运行时上手手记
把桌面应用部署从三天压缩到三分钟Windows桌面运行时上手手记【免费下载链接】windowsdesktop项目地址: https://gitcode.com/gh_mirrors/wi/windowsdesktop凌晨一点我又收到一条新工单我双击你的软件弹了个错误说要装什么.NET装完还是不行。这不是第一次了。办公室里那台Windows 7测试机、客户的Windows 11笔记本、财务部的老台式机——同一份安装包三种报错。那段时间我几乎成了半个客服白天写代码晚上远程帮用户装环境。直到我认真研究了Windows桌面运行时Windows Desktop Runtime这套开源方案部署这件事才真正从噩梦变成了日常。一、先拆解桌面应用部署到底难在哪在动手找方案之前我把过去半年踩过的坑归了归类发现绕来绕去其实就三个根源。第一环境依赖像迷宫。用户电脑里装的是哪个版本的.NET Framework完全不受你控制。老系统自带老版本新系统又未必兼容旧程序你没法替用户决定他机器上有什么。第二版本之间互相打架。应用A要求运行时2.0应用B要求3.0两个版本装在一起有时相安无事有时直接冲突。轻则新装的应用起不来重则旧应用也跟着遭殃。第三安装过程劝退用户。下载一个几百兆的东西、手动改环境变量、装完还要重启——每一步都是流失点。用户不会因为你技术强就原谅体验差他只会觉得这软件真难用。想明白这一点你就抓住了关键问题不在你的应用而在运行时的分发方式。谁能让运行时安装这件事消失谁就赢了。二、它是怎么把装环境变成双击一下的Windows桌面运行时做了一件很朴素的事把WinForms和WPF应用需要的运行环境整体打成一个统一的安装包一次装齐。它的源码仓库就叫 windowsdesktop克隆后直接能看git clone https://gitcode.com/gh_mirrors/wi/windowsdesktop仓库不大核心逻辑集中在这几个地方安装包构建在src/windowsdesktop/src/bundle/运行时组件的打包在src/windowsdesktop/src/sfx/配套的验证测试在src/windowsdesktop/tests/。下面挑重点说。安装包内部到底做了什么事打开src/windowsdesktop/src/bundle/bundle.wxs你能看到一个典型的WiX引导程序bootstrapper。它的核心思路是按依赖顺序依次安装.NET Host主机→ Host Fxr解析器→ .NET Runtime基础运行时→ Windows Desktop Runtime桌面运行时顺序是有讲究的。Host是地基HostFxr负责找运行时基础运行时是底座最后的Windows Desktop Runtime才是WinForms和WPF真正需要的部分。每一步都是独立的MSI包环环相扣缺一不可。同时整条安装链被一个RollbackBoundary包住——如果中间任何一步失败系统会把已安装的部分全部回滚不会给用户留下一个装了一半的残废环境。这个细节我很欣赏宁可整个失败重来也不制造无法收拾的中间态。一条命令完成静默部署如果只是给个人用户双击安装那还不算本事。真正解放运维的是它的命令行能力。在安装包里直接跑这几个参数就能实现运行时静默安装# 无提示安装不打扰用户 windowsdesktop-runtime-xxx-win-x64.exe /quiet /norestart # 带日志安装便于排查问题 windowsdesktop-runtime-xxx-win-x64.exe /install /quiet /log install.log # 只生成离线副本交给内网分发 windowsdesktop-runtime-xxx-win-x64.exe /layout D:\offline/layout是我最喜欢的功能它不安装任何东西只把完整的安装包副本铺到一个目录里。对于不允许连外网的企业内网这一招直接解决分发难题。升级路径是设计出来的不是碰运气很多部署翻车都翻在升级上。老用户机器上已经装了2.0你推送3.0是覆盖还是共存Windows桌面运行时的做法是用稳定的UpgradeCode串起预览版→RC→正式版→服务更新的完整升级链代码在Wix.targets里正式版之间按架构区分允许同机共存又不会互相覆盖。有意思的是针对预览版和正式版它连降级策略都分开处理预览版允许降级以便测试正式版则禁止降级防止服务更新把用户带回老版本。十四种语言改一行就能定制安装界面不是你想象中的白板Windows对话框。在src/windowsdesktop/src/bundle/theme/下躺着14个语言目录——中文简/繁、英、法、德、日、韩、西、葡、意、土、俄等。每个目录一个thm.wxl管着这个语言下的全部界面文案。比如2052/thm.wxl是简体中文安装成功安装失败正在处理这些提示都在里面。界面布局由bundle.thm定义配色、字体、窗口尺寸都是可调参数。想换品牌视觉改主题文件就行想加自己的文案替换本地化文件即可完全不需要动逻辑代码。三、运行时本身是怎么被造出来的安装包负责分发那WinForms和WPF的组件代码从哪来看src/windowsdesktop/src/sfx/就明白了。这里产出两类包Ref 包Microsoft.WindowsDesktop.App.Ref编译期用的引用程序集开发者写代码时引用它。Runtime 包Microsoft.WindowsDesktop.App.Runtime运行期真正加载的实现按win-x86、win-x64、win-arm64分别构建。Directory.Build.targets里有一份长长的FrameworkListFileClass清单把 WPF 的PresentationCore.dll、PresentationFramework.dllWinForms 的System.Windows.Forms.dll等逐一登记区分哪些是两者共用、哪些只属于WPF。清单最终生成FrameworkList.xml交给SDK做运行时引用解析。换句话说你写的 WinForms 或 WPF 项目能直接引用这些命名空间靠的就是这套清单在背后排班。四、代码交付前还有一道质检关卡构建完不等于能交付。仓库里tests/WindowsDesktopNupkgTests.cs专门做产物体检Ref包里的FrameworkList.xml必须带正确的 Profile 分类Runtime 包必须齐全多出来的、缺掉的文件都会在测试阶段被揪出来。看到这些测试我对它敢对外发布又多了一分信心。五、从零到交付我建议你按这个顺序走如果你也想把 Windows桌面运行时 用起来我的路线大致是这样第一步搭环境。准备一台 Windows 机器装好 .NET 9 SDK把仓库克隆下来地址上面给过。第二步跑通构建。先别急着定制用仓库自带的构建脚本出一次官方默认包确认工具链全通。第三步做品牌定制。改bundle.thm的配色和字体把theme/2052/thm.wxl里你觉得不顺眼的文案换掉替换 logo 资源。第四步验证部署链路。在一台干净虚拟机里分别测双击安装、/quiet 静默安装、/layout 离线副本三条路径把日志留下来存档。第五步接入升级机制。确认你的版本号和 UpgradeCode 命名策略让后续每次发版都走同一条可回滚、可追溯的链路。六、不同团队用法其实不一样个人独立开发者最划算一个安装包覆盖全部用户再也不用写请先安装.NET的说明文档客服工作量直线下降。企业IT团队可以把它玩出花来脚本批量静默部署、内网离线分发、统一版本基线——几百台机器的环境从此整齐划一排查问题时不用再猜这台机器上到底装了什么。教育机构则看中它的下限学生电脑配置参差不齐、老师不熟悉命令行双击下一步就能完成的安装本身就是最好的用户体验课。写在最后回看那段被工单支配的日子我最大的体会是部署体验不是应用的附属品而是应用的一部分。Windows桌面运行时把运行时安装这件最烦人的事压缩成了用户无感的一步也把开发者从环境客服的角色里解放了出来。下一次当你准备发布桌面应用时不妨先问问自己你的用户需要为装运行时付出多少耐心答案值得你花一个下午把这份代码读一遍。提示本文提到的所有模块路径均以src/windowsdesktop/为根目录克隆仓库后即可对照阅读建议先从bundle.wxs的 Chain 部分读起那里是整个分发体系的心脏。【免费下载链接】windowsdesktop项目地址: https://gitcode.com/gh_mirrors/wi/windowsdesktop创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考