云服务器外网ip
程序能悄无声息地把自己升级好,用户只觉着程序多启动了一次,其他没感觉。这就是这个轻量级 Windows 自动更新工具最终能做到的事。
结果先说清楚:一次完整的升级流程是这样走的——主程序启动时先看有没有新版本,发现差异就把下载工作交给 Upgrade.exe 去做,文件被替换后再把主程序重启回来。如果本次没有更新或更新失败,会在本地留下一个 NoUpgrade.ini,用来避免连续多次弹窗打扰;整套逻辑由外部的 UpLoadVersion.json 驱动,地址、文件列表、是否自动等都写在这个 JSON 里。实现上不会依赖数据库或云后端,只要把最新的文件和 JSON 放到一个可访问的目录,客户端就能识别并更新。
往回讲设计思路:开发者把更新逻辑从主业务剥离,主程序只负责在启动时检查更新并调用独立的升级程序。这样好处是耦合度低,系统简单,运维只需替换服务器上的 JSON 和更新包就能触发升级。框架用 .NET 写的,核心分两个模块:主程序集成检查逻辑和独立的 Upgrade.exe 执行器。配置项全放外面,更新地址、文件名和文件的 MD5 都能在 UpLoadVersion.json 里看到。
具体功能点要讲清楚:客户端会把本地安装目录里的 UpLoadVersion.json 和服务器上的同名文件做对比,找出 MD5 不一致或新增的文件,然后按列表把服务器上的文件一个个拉下来。支持任意数量的更新文件;如果 JSON 里 IsAutoUpLoad 设为 true,下载会自动开始,不需要用户点确认;否则会弹个提示让人决定。下载并替换完成后,升级程序会根据 ProgrmStartupDir 或者调用时传入的主程序路径把目标程序启动起来。为了避免短时间内反复检测、烦人弹窗,流程里会在无更新或失败时创建 NoUpgrade.ini;在检查流程自然结束时会把它删除,保证下次能按需再检测。
配置字段说明要写清:UpLoadVersion.json 是关键,需要同时放在本地安装目录和服务器更新目录里。里面会有 UpLoadContent(更新提示文本),UpLoadFileUrl(服务器上更新文件所在的根 URL,记得以 / 结尾),ProgrmStartupDir(更新后要启动的程序路径,可留空,如果启动 Upgrade.exe 时传入主程序路径则优先使用传入值),IsAutoUpLoad(是否自动更新),UpLoadFiles(待更新文件数组,每项包含文件名和 MD5,用于比对是否需要下载)。用这种方式,运维不必改代码就能控制哪个版本、哪些文件需要更新。
部署上也不复杂:把更新文件放到网站目录里,网站的物理路径指向最新程序的更新目录。如果访问时遇到 403 错误,在 IIS 管理器里选中该网站 → 功能视图 → "目录浏览" → 点击右侧 "启用" 即可。为了生成 UpLoadVersion.json,可以把 UpLoadDemoXmlBuild.exe 复制到发布目录,运行后点击生成按钮,程序会遍历目录并计算每个文件的 MD5,然后把结果写到 UpLoadVersion.json。
成都 云服务器
阿里云服务器ftp地址
把检查逻辑接入程序里很简单:在 Program.cs 或 WPF 的 OnStartup 方法里加入启动判断。先通过环境变量 VisualStudioVersion 判断当前进程是否在 Visual Studio 调试环境下,避免开发时误触发升级。然后看本地有没有 NoUpgrade.ini:如果存在就跳过这次检查,直接继续程序启动;如果没有,就启动 Upgrade.exe 并把当前主程序路径传给它。检测结束后会删除 NoUpgrade.ini,保证后续能再次检测。
运行时的体验按步骤会是这样:起始时本地没有更新文件;程序启动并检测服务器版本,如果发现服务器上有新版本且 IsAutoUpLoad 为 true,就直接开始下载;文件下载并替换完成后,Upgrade.exe 结束自己的工作并把目标程序启动起来;本地的 UpLoadVersion.json 会被同步成和服务器一致的内容。出现错误或无新版本时,会生成 NoUpgrade.ini,避免短时间内重复弹窗打扰,但系统会在合适的节点把它清理掉,保持检测的连续性。
说点实话:这工具不追求炫技,功能也不复杂,但够用。对不想上 Electron autoUpdater 或付费商业更新服务的小团队很合适。它把能把文件拉下来替换并重启程序这件事做实了,后面想扩展签名校验或差分包也挺顺手。
源码位置:Gitee:https://gitee.com/sageinqi/UpLoadDemo
如果有人想看示例或直接拿来改造,代码和示例都在上面,欢迎去拉下来跑一遍。
云免服务器推荐
