C#实现自动升级(附源码)

       对于PC桌面应用程序而言,自动升级功能每每是必不可少的。而自动升级能够做为一个独立的C/S系统来开发,这样,就能够在不一样的桌面应用中进行复用。本文将着重介绍OAUS的相关背景、使用方法,至于详细的实现细节,你们能够直接下载源码研究。若是了解了OAUS的使用,源码的理解就很是容易了。若是须要直接部署使用自动升级系统,那么,可下载文末的可执行程序压缩包。html

一.OAUS的主要功能

  目前主流的程序自动升级策略是,从新下载最新的安装包,而后从新安装整个客户端。这种方式虽然简单直观,可是缺陷也很明显。好比,即便整个客户端有100M,而本次更新仅仅只是修改了一个1k大小的dll,那也意味着要从新下载100M的所有内容。这对带宽是极大的浪费,并且延长了升级了时间,相应地也增长了客户茫然等待的时间。服务器

      在上述的场景中,自动升级时,咱们可否只更新那个被修改了的1k的dll了?固然,使用OAUS自动升级系统能够轻松地作到这一点。OAUS自动升级系统能够对被分发的客户端程序中的每一个文件进行版本管理,每次升级的基础单元再也不是整个客户端程序,而是其中的单个文件。针对单个文件的更新,包括三种形式:app

(1)文件被修改。ide

(2)文件被删除。spa

(3)新增长某个文件。.net

      OAUS对这三种形式的文件更新都是支持的。每次自动升级,均可以更改N个文件、删除M个文件、新增长L个文件。日志

二.OAUS的使用

1.OAUS的结构

      OAUS提供了可直接执行的服务端程序和客户端程序:AutoUpdaterSystem.Server.exe 和 AutoUpdater.exe。 OAUS服务端的目录结构以下所示:code

           

      OAUS的客户端与服务器之间经过TCP通讯,能够在AutoUpdaterSystem.Server.exe.config配置文件中配置服务器经过哪一个TCP端口提供自动升级服务。xml

      FileFolder文件夹初始是空的,其用于部署被分发的程序的各个文件的最新版本。注意,其下的文件结构必定要与被分发的程序正常部署后的结构彻底一致 -- 即至关于在FileFolder文件夹下部署一个被分发的程序。htm

      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(可直接部署) 

 

 

 

出处:https://blog.csdn.net/zhuweisky/article/details/50439386

相关文章
相关标签/搜索