三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从零集成GeneralUpdate:WPF应用自动更新分步教程(附完整代码)

从零集成GeneralUpdate:WPF应用自动更新分步教程(附完整代码)

从零集成GeneralUpdate:WPF应用自动更新分步教程(附完整代码)

【免费下载链接】GeneralUpdateUnlimited Updates, Boundless Upgrades.项目地址: https://gitcode.com/gh_mirrors/ge/GeneralUpdate

给 WPF 应用加上自动更新能力,是很多桌面开发者绕不开的功课。GeneralUpdate 是一个基于 .NET 的跨平台应用自动更新组件,不依赖任何 UI 框架,一句代码即可启动更新流程,配合 Client 与 Upgrade 双进程架构,能够稳定地完成版本校验、下载、差分补丁、备份回滚等完整链路。本教程将从零开始,手把手带你把 WPF 应用自动更新集成到自己的项目里,全程附可直接运行的完整代码。

一、集成前必须知道的 3 个核心概念

在写代码之前,先用 1 分钟理解 GeneralUpdate 的运转方式,后面会少踩很多坑。

概念说明
Client 角色你的 WPF 主程序。负责向服务端校验版本、下载更新包、拉起升级进程
Upgrade 角色升级程序(如Updater.exe)。不做任何网络请求,只负责解压、打补丁、替换文件、重新拉起主程序
manifest 文件generalupdate.manifest.json,记录主程序名、版本号、产品 ID 等身份信息,Client 启动时自动读取

双进程的好处很直观:主程序文件被占用时无法覆盖,而升级程序可以替代主程序完成"换血",这也是桌面应用自动更新最经典的实现方案。

二、第一步:获取并引入 GeneralUpdate

在解决方案中通过 NuGet 引入GeneralUpdate.Core包即可。如果想查看源码或参考示例,可以克隆仓库到本地:

git clone https://gitcode.com/gh_mirrors/ge/GeneralUpdate

仓库内置了可直接运行的演示工程,建议先跑通再迁移到自己的 WPF 项目:

  • 客户端示例:tests/ClientTest/Program.cs,演示 Client 角色的完整更新流程
  • 升级端示例:tests/UpgradeTest/Program.cs,演示 Upgrade 角色如何应用补丁
  • 核心入口源码:src/GeneralUpdate.Core/Bootstrap/GeneralUpdateBootstrap.cs

三、第二步:创建 manifest 配置文件

在 WPF 主程序输出目录下新建generalupdate.manifest.json,内容如下:

{ "mainAppName": "ClientTest.exe", "clientVersion": "1.0.0", "appType": "Client", "updateAppName": "UpgradeTest.exe", "upgradeClientVersion": "2.0.0.0", "productId": "8d74e7eb-160c-4a4b-a5dd-c71a7bb08eeb", "updatePath": "update/" }

几个关键字段的含义:

  • mainAppName:主程序可执行文件名,用于更新完成后拉起主程序
  • clientVersion:当前客户端版本号,服务端据此判断是否需要更新
  • updateAppName:升级程序文件名
  • productId:产品的唯一标识,服务端区分不同应用

四、第三步:在 WPF 主程序中接入 Client 角色

在 WPF 应用启动时(例如App.xaml.cs的启动事件或主窗体加载事件)调用GeneralUpdateBootstrap,链式配置几行代码即可完成集成:

using GeneralUpdate.Core; using GeneralUpdate.Core.Configuration; using GeneralUpdate.Core.Download; await new GeneralUpdateBootstrap() .SetConfig(new UpdateRequest { UpdateUrl = "http://localhost:7391/Upgrade/Verification", ReportUrl = "http://localhost:7391/Upgrade/Report", AppSecretKey = "your-app-secret-key" }) .SetOption(Option.AppType, AppType.Client) .Hooks<MyUpdateHooks>() .AddListenerMultiDownloadStatistics(OnDownloadStatistics) .AddListenerUpdateInfo(OnUpdateInfo) .LaunchAsync();

配置说明:

  • UpdateUrl:服务端版本校验接口地址
  • AppSecretKey:应用密钥,用于接口鉴权
  • SetOption(Option.AppType, AppType.Client):声明当前进程角色为主程序
  • Hooks<T>():注册更新生命周期钩子,可在更新前、下载完成、更新后等节点插入自定义逻辑
  • AddListenerXxx:订阅下载进度、版本信息等事件,用于在 UI 上展示进度条

五、第四步:创建升级程序(Upgrade 角色)

新建一个控制台或 WinForms 工程作为升级程序,代码量更少——所有配置都通过加密 IPC 文件从主程序传递过来:

await new GeneralUpdateBootstrap() .SetOption(Option.AppType, AppType.Upgrade) .Hooks<UpgradeTestHooks>() .LaunchAsync();

升级进程启动后会自动读取 IPC 文件中的版本信息和安装路径,应用补丁后重新拉起主程序并自行退出。整个过程无需命令行参数、无需配置文件,逻辑集中在src/GeneralUpdate.Core/Strategy/UpdateStrategy.cs中。

六、第五步:订阅事件,在 WPF 界面展示更新进度

想要在 WPF 窗口上实时显示下载进度,订阅MultiDownloadStatistics事件即可:

static void OnDownloadStatistics(object sender, MultiDownloadStatisticsEventArgs e) { var v = e.Version as VersionEntry; Console.WriteLine($"[Download] {v?.Version}: {e.ProgressPercentage}%"); }

GeneralUpdate 提供 7 类事件监听,覆盖版本信息、单个下载完成、全部下载完成、下载错误、异常、进度统计等全部场景,完整定义见src/GeneralUpdate.Core/Event/目录。事件处理器可以直接在 WPF 的Dispatcher中更新进度条与下载速度文案。

七、测试与验证:5 分钟跑通全流程

  1. 启动一个简易更新服务端,提供版本校验与文件下载接口
  2. 发布两个版本的应用,在服务端配置新版本信息
  3. 运行旧版主程序,观察其自动校验、下载、拉起升级进程
  4. 升级进程完成文件替换后自动拉起新版主程序,验证版本号已更新

调试时建议打开调试日志,日志出口定义在src/GeneralUpdate.Core/Tracer/GeneralTracer.cs,问题定位会轻松很多。

八、进阶能力速览

完成基础集成后,GeneralUpdate 还提供这些开箱即用的进阶能力:

  • 差分更新:通过UseDiffPipeline启用 HDiffPatch 差分算法,只下载变更部分,大幅节省流量
  • 备份回滚:更新前自动备份安装目录,失败时一键回滚到上一个可用版本
  • 静默更新:设置Option.Silent开启后台轮询,应用退出时自动完成升级,用户无感知
  • 跨平台支持:同一套 API 同时支持 Windows、Linux、macOS,见src/GeneralUpdate.Core/Strategy/下的平台策略
  • OSS 对象存储:支持从阿里云 OSS、AWS S3、MinIO 等云存储直接分发更新包

写在最后

自动更新是桌面应用的"基础设施",早集成早省心。GeneralUpdate 把最复杂的双进程协作、差分算法、备份回滚都封装好了,你只需要像上面这样配置十几行代码,就能为 WPF 应用加上专业级的自动更新能力。建议从仓库里的示例工程入手,跑通后再逐步接入自己的业务逻辑,整个过程通常不超过半天。🚀

【免费下载链接】GeneralUpdateUnlimited Updates, Boundless Upgrades.项目地址: https://gitcode.com/gh_mirrors/ge/GeneralUpdate

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表