C#实现自动升级(附源码)
对于PC桌面应用程序而言,自动升级功能往往是必不可少的。而自动升级可以作为一个独立的C/S系统来开发,这样,就可以在不同的桌面应用中进行复用。本文将着重介绍OAUS的相关背景、使用方法,至于详细的实现细节,大家可以直接下载源码研究。如果了解了OAUS的使用,源码的理解就非常容易了。如果需要直接部署使用自动升级系统,那么,可下载文末的可执行程序压缩包。
一.OAUS的主要功能
目前主流的程序自动升级策略是,重新下载最新的安装包,然后重新安装整个客户端。这种方式虽然简单直观,但是缺陷也很明显。比如,即使整个客户端有100M,而本次更新仅仅只是修改了一个1k大小的dll,那也意味着要重新下载100M的全部内容。这对带宽是极大的浪费,而且延长了升级了时间,相应地也增加了客户茫然等待的时间。
在上述的场景中,自动升级时,我们能否只更新那个被修改了的1k的dll了?当然,使用OAUS自动升级系统可以轻松地做到这一点。OAUS自动升级系统可以对被分发的客户端程序中的每个文件进行版本管理,每次升级的基础单元不再是整个客户端程序,而是其中的单个文件。针对单个文件的更新,包括三种形式:
(1)文件被修改。
(2)文件被删除。
(3)新增加某个文件。
OAUS对这三种形式的文件更新都是支持的。每次自动升级,都可以更改N个文件、删除M个文件、新增加L个文件。
二.OAUS的使用
1.OAUS的结构
OAUS提供了可直接执行的服务端程序和客户端程序:AutoUpdaterSystem.Server.exe 和 AutoUpdater.exe。 OAUS服务端的目录结构如下所示:
OAUS的客户端与服务器之间通过TCP通信,可以在AutoUpdaterSystem.Server.exe.config配置文件中配置服务器通过哪个TCP端口提供自动升级服务。
FileFolder文件夹初始是空的,其用于部署被分发的程序的各个文件的最新版本。注意,其下的文件结构一定要与被分发的程序正常部署后的结构完全一致 -- 即相当于在FileFolder文件夹下部署一个被分发的程序。
OAUS客户端的目录结构如下:
可以在AutoUpdater.exe.config配置文件中配置OAUS服务器的IP、端口等信息,其内容如下所示:
<configuration><appSettings><!--服务器IP --><add key="ServerIP" value="127.0.0.1"/><!--服务器端口--><add key="ServerPort" value="4530"/><!--升级完成后,将被回调的可执行程序的名称--><add key="CallbackExeName" value="Demo.exe"/><!--主窗体的Title--><add key="Title" value="文件更新"/></appSettings> </configuration>
请注意配置的CallbackExeName,其表示当升级完成之后,将被启动的分发程序的exe的名称。这个CallbackExeName配置的为什么是名称而不是路径了?这是因为使用和部署OAUS客户端时是有要求的:
(1)被分发的程序的可执行文件exe必须位于部署目录的根目录。
(2)OAUS的客户端(即整个AutoUpdater文件夹)也必须位于这个根目录。
如此,AutoUpdater就知道分发程序的exe相对自己的路径,如此就可以确定分发程序的exe的绝对路径,所以就可以在升级完成后启动目标exe了。另外,根据上述的两个约定,再结合前面讲到的服务端的FileFolder文件夹的结构约定,当服务端更新一个文件时,AutoUpdater便可以确定该文件在客户端机器上的绝对路径了。
2. OAUS自动升级流程
下面我们就详细讲讲如何使用OAUS来构建自动升级系统,大概的步骤如下。
(1)运行OAUS服务端。
(2)将被分发的客户端程序的所有内容放到OAUS服务端的FileFolder文件夹下,其结构与客户端程序正常部署后的结构要完全一致。我们以部署VideoChatSystem为例。
(3)使用OAUS服务端为被分发的客户端程序的每个文件生成默认版本号,并创建版本信息配置文件UpdateConfiguration.xml。这个配置文件也将被客户端使用。
点击服务端界面上的“文件版本管理”按钮,将弹出用于管理各个文件版本的【文件版本信息】窗体。
当用新版本的文件覆盖老的文件后,点击“自动扫描”按钮,服务端就会检索FileFolder文件夹下文件的名称、大小、最后更新时间,然后得出本次更新结果:变化了几个文件、新增了几个文件、删除了几个文件。 自动扫描功能把之前的手动操作全部简化了。
如果需要手动操作,可以这样做:
双击列表中的任意一行,可以修改其对应文件的版本的值(int类型的数值)。注意,此列表中的版本信息与文件的真实版本属性(比如dll的版本属性X.X.X.X)可以是没有任何联系的,列表中版本的值只是用于标记文件是否被修改,所以,文件每被修改一次,其列表中对应的版本的值就应该有所增大。
当关闭【文件版本信息】窗体时,只要有某个文件版本变化,则“最后综合版本”的值(int类型)会递增1。通过比较OAUS的客户端保存的“最后综合版本”的值与OAUS的服务端最新的“最后综合版本”的值,就可以快速地识别客户端是否已经是最新版本了。
另外,初次打开这个窗口时,将在OAUS服务端的目录下,自动生成一个版本信息配置文件UpdateConfiguration.xml。而且,每当通过该窗体来设置某个文件的新版本时,UpdateConfiguration.xml会自动同步更新。
(4)将UpdateConfiguration.xml添加到OAUS的客户端程序(即上述的AutoUpdater的文件夹)中。
(5)在创建被分发的客户端的安装程序时,将OAUS的客户端(即AutoUpdater的文件夹)也打包进去,并且像前面说的一样,要将其直接部署在运行目录(BaseDirectory)下(与分发的exe同一目录)。
如此,准备工作就完成了,当客户端通过安装包安装好了VideoChatSystem之后,其目录结构像下面这样:
(6)当我们有新的版本要发布时,比如要更新某个文件(因为文件被修改),那么可以这样做:
a.将修改后的文件拷贝到OAUS服务端的FileFolder文件夹下的正确位置(或覆盖旧的文件)。
b.在OAUS服务端打开【文件版本信息】窗体,双击被修改文件所对应的Row,在弹出的窗体上修改对应文件的版本号,将版本号的数值增加。(如果是删除旧文件或添加新文件,此处也可进行相应的操作)
(7)如此,当客户端再启动AutoUpdater.exe时,就会自动升级,更新那些发生变化的文件。 以下是AutoUpdater.exe运行起来后的截图。
(8)当升级完成后,将启动前述的OAUS客户端配置文件中配置的回调exe。(在本例中就是VideoChatSystem.exe)
(9)OAUS客户端会在日志文件UpdateLog.txt(位于AutoUpdater的文件夹下,在OAUS客户端首次运行时自动生成该文件)中,记录每次自动升级的情况。
(10)如果升级的过程中,与服务端连接中断,则会自动重连,在重连成功后,将启动断点续传。
3.何时启动自动升级客户端?
假设某个系统是下载客户端形式的,那么客户端该如何知道是否有新版本了?然后又该何时启动AutoUpdater.exe了?
我们的经验是这样的:客户端登录成功之后,从服务器获取“最后综合版本”的值,然后与本地的“最后综合版本”的值相比较,如果本地的值较小,则表示客户端需要更新。这个过程可以这样做到:
(1)当在OAUS服务端的FileFolder文件夹下放置了新的文件,并通过【文件版本信息】窗体正确的更新了版本号,在关闭【文件版本信息】窗体时,“最后综合版本”的值会自动加1。
(2)系统客户端可以通过调用OAUS.Core.VersionHelper类的静态方法HasNewVersion()来判断是否有新版本。
(3)如果HasNewVersion方法返回true,则通常有两种模式:由用户选择是否升级,或者是强制升级。
一般而言,如果最新客户端程序与老版本兼容,不升级也影响不大,则可以交由用户决定是否升级;如果最新客户端程序不兼容老版本,或者是有重大更新,则将启动强制升级。如果流程要进入启动升级,那么只要启动AutoUpdater的文件夹下AutoUpdater.exe就可以了。要注意的是,启动AutoUpdater.exe进程后,要退出当前的客户端进程,否则,有些文件会因为无法被覆盖而导致更新失败。代码大致如下所示:
if (VersionHelper.HasNewVersion(oausServerIP,oausServerPort)) { string updateExePath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater\\AutoUpdater.exe"; System.Diagnostics.Process myProcess = System.Diagnostics.Process.Start(updateExePath); ......//退出当前进程 }
三.相关下载
1.自动升级系统OAUS - 源码
2.自动升级系统OAUS(可直接部署)
C#实现自动升级(附源码)相关推荐
- 基于TCP网络通信的自动升级程序源码分析-客户端接收文件
升级程序客户端接收文件 /// <summary>/// 文件数据缓存 索引是 ConnectionInfo对象 数据包的顺序号 值是数据/// </summary>Dicti ...
- 华为轻量级网络架构,幽灵网络(GhostNets)再升级——附源码下载
关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 论文地址:https://arxiv.org/pdf/2201.03297.p ...
- 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)
前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...
- Pygame实战:升级后的2048小游戏—解锁新花样,根本停不下来【附源码】
导语 "嗨嗨嗨!别睡了,醒醒醒醒!该干活儿了~" by--顾木子吖! "刚睡醒,大佬你有什么事儿吖?" by--全体成员! 上期给大家分享的超详细--简易版本的 ...
- python模拟火车订票系统代码_Python3.6实现12306火车票自动抢票,附源码
原标题:Python3.6实现12306火车票自动抢票,附源码 Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已 ...
- 用Python自动刷新抢12306火车票(附源码)
專 欄 ❈ 作者:marvin,互联网从业者,现居上海张江 ❈ 一年一度的春运又来了,今年我自己写了个抢票脚本.使用Python+Splinter自动刷新抢票,可以成功抢到.(依赖自己的网络环境太厉害 ...
- 免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)
免费开源的高精度OCR文本提取,支持 100 多种语言.自动文本定位和脚本检测,几行代码即可实现离线使用(附源码). 要从图像.照片中提取文本吗?是否刚刚拍了讲义的照片并想将其转换为文本?那么您将需要 ...
- wallpaper代码_五行Python代码自动换你的电脑桌面壁纸(内附源码和exe)
很多行友问行哥,Python能不能自动更换电脑壁纸呀,今天它来了 只需要一行代码,指定图片地址即可更换电脑桌面.加上壁纸文件夹路径,让你随机更换电脑桌面,带来不期而遇的新鲜.使用爬虫技术,自动下载壁纸 ...
- html怎么让方块自动旋转,如何使用纯CSS实现一个圆环旋转错觉的动画效果(附源码)...
本篇文章给大家带来的内容是关于如何使用纯CSS实现一个圆环旋转错觉的动画效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 效果预览 源代码下载 https://github.com ...
- 推荐一套开源通用后台管理系统(附源码)
今日推荐 Java 8 一行代码解决了空指针问题,太厉害了...List中remove()方法的陷阱,被坑惨了!25000 字详解 23 种设计模式,原来可以这么简单!最牛逼的 Java 日志框架,性 ...
最新文章
- Python访问街区10个点,并俩俩绘制一条线,得到5条线,求最短的距离和?
- 生产环境故障处理之nginx缓存权限问题
- linux mysql详解,Linux 下mysql安装使用详解
- 不要争了,别的程序员是这么给变量起名的!
- 第三届“中国法研杯”司法人工智能挑赛(CAIL2020)即将启动
- 晶振,数字电路的心脏~
- 2016/11/10 kettle概述
- 【More Effective C++】Item 6
- hadoop的shuffle过程
- 树莓派百度语音识别+图灵机器人对话聊天机器人
- Linux基础(day74)
- linux clock()_对比python与linux中时间管理的三件工具calender clock datetime
- viper4android蓝牙耳机,蝰蛇音效app下载-蝰蛇音效官方版(ViPER4Android FX)下载v2.7.1.0 安卓版-单机手游网...
- 《秘密》-- 东野圭吾
- 文件下载和二进制文件(图片、mp4视频)预览响应头的设置(防止中文名名乱码)
- 别TM去外包公司!工作群里抢个红包都得退回去...
- 第六章 使用Direct3D绘制
- ResponseEntity
- 如何在cad中导入谷歌地图_如何在Google地图中设置出发和到达时间
- 做了3年半测试员,薪资不到20K,今天,我辞职了…
热门文章
- win10 SystemParametersInfo 设置屏保 不好使_火爆抖音的旋转时钟屏保,超酷超炫的...
- NLP的两种工具的java版使用:复旦FudanNLP,中科院计算所ICTCLAS2013
- Ubuntu 16.10 下 使用 C/C++ IDE anjuta 编译出现You must have `libtool' installed
- 手动以及使用torch.nn实现前馈神经网络实验
- android旧版本运行器下载,有没有办法让新版安卓系统运行以前老安卓版本的软件?...
- 分布式机器学习——入门篇
- 文本表示与文本特征提取的区别
- “熵减”之下,欧瑞博填补全屋智能国产操作系统空白
- 分形之谢尔宾斯基(Sierpinski)三角形
- Jason表情包在线生成,王境泽表情包,为所欲为表情包,窃格瓦拉表情包,在线生成