七天入门C#上位机——第七天:能远程升级打补丁你说香不香
对于一个优秀的PC桌面应用程序而言,自动升级功能是必不可少的,目前应用程序主流的自动升级策略是重新下载安装包安装整个客户端,这种方法简单易用,但缺点也很明显,比如,即使整个客户端有10G,而本次更新仅仅只是修改了一个1k大小的dll,那意味着为了更新1k的修改内容要重新下载10G的全部内容,这显然极大地浪费了资源,延长了升级了时间。本文介绍一种基于OAUS的自动升级系统,相关背景、使用方法;
一.OAUS的主要功能
在上述的场景中,在使用自动升级时,我们的目标是只更新被修改了的那一小部分的dll,使用OAUS自动升级系统可以轻松地做到这一点。OAUS自动升级系统可以对被分发的客户端程序中的每个文件进行版本管理,每次升级的基础单元不再是整个客户端程序,而是其中的单个文件。针对单个文件的更新,包括三种形式:
(1)修改文件。
(2)删除文件。
(3)新增文件。
二.OAUS的使用
1.OAUS的结构
OAUS提供了可直接执行的服务端程序AutoUpdaterSystem.Server.exe和客户端程序AutoUpdater.exe,OAUS服务端的目录结构如下所示:
OAUS的客户端与服务器之间是通过TCP通信的,需要在配置文件中配置TCP端口提供自动升级服务。
FileFolder文件夹初始是空的,其用于部署被分发的程序的各个文件的最新版本。注意,其下的文件结构一定要与被分发的程序正常部署后的结构完全一致 -- 即相当于在FileFolder文件夹下部署一个被分发的程序。
OAUS客户端的目录结构如下:
可以在AutoUpdater.exe.config配置文件中配置OAUS服务器的IP、端口等信息,其内容如下所示:
请注意配置的CallbackExeName,其表示当升级完成之后,将启动分发程序的exe的名称。CallbackExeName配置的为什么是名称?这是因为使用和部署OAUS客户端时是有要求的:
(1)被分发的程序的可执行文件exe必须位于部署目录的根目录。
(2)OAUS的客户端(即整个AutoUpdater文件夹)也必须位于这个根目录。
如此,根据上述的两个约定,再结合服务端的FileFolder文件夹的结构,当服务端更新一个文件时,AutoUpdater便可以确定该文件在客户端机器上的绝对路径。
2. OAUS自动升级流程
(1)运行OAUS服务端。
(2)将被分发的客户端程序的所有内容放到OAUS服务端的FileFolder文件夹下,其结构与客户端程序正常部署后的结构要完全一致。
(3)使用OAUS服务端为被分发的客户端程序的每个文件生成默认版本号,并创建版本信息配置文件UpdateConfiguration.xml。
(4)将UpdateConfiguration.xml添加到OAUS的客户端程序中。
(5)在创建被分发的客户端的安装程序时,将OAUS的客户端打包进去,并将其直接部署在运行目录下。
如此,准备工作就完成了,当客户端通过安装包安装好。
6)当我们因为文件被修改有新的版本要发布时,那么可以这样做:
a.将修改后的文件拷贝到OAUS服务端的FileFolder文件夹下的正确位置(或覆盖旧的文件)。
b.在OAUS服务端打开【文件版本信息】窗体,双击被修改文件所对应的Row,在弹出的窗体上修改对应文件的版本号,将版本号的数值增加。(如果是删除旧文件或添加新文件,此处也可进行相应的操作)
(7)如此,当客户端再启动AutoUpdater.exe时,就会自动升级,更新那些发生变化的文件。以下是AutoUpdater.exe运行起来后的截图。
(8)当升级完成后,将启动前述的OAUS客户端配置文件中配置的回调exe。
(9)OAUS客户端会在日志文件UpdateLog.txt(位于AutoUpdater的文件夹下,在OAUS客户端首次运行时自动生成该文件)中,记录每次自动升级的情况。
(10)如果升级的过程中,与服务端连接中断,则会自动重连,在重连成功后,将启动断点续传。