对于PC桌面应用程序而言,自己主动升级功能往往是不可缺少的。

而自己主动升级能够作为一个独立的C/S系统来开发,这样,就能够在不同的桌面应用中进行复用。本文将着重介绍OAUS的相关背景、用法,至于具体的实现细节,大家能够直接下载源代码研究。

假设了解了OAUS的使用。源代码的理解就非常easy了。

假设须要直接部署使用自己主动升级系统,那么,可下载文末的可执行程序压缩包。

一.OAUS的主要功能

  眼下主流的程序自己主动升级策略是,又一次下载最新的安装包,然后又一次安装整个client。

这种方式尽管简单直观,可是缺陷也非常明显。比方,即使整个client有100M。而本次更新仅仅仅仅是改动了一个1k大小的dll,那也意味着要又一次下载100M的所有内容。

这对带宽是极大的浪费,并且延长了升级了时间,相应地也添加了客户茫然等待的时间。

      在上述的场景中,自己主动升级时,我们是否能仅仅更新那个被改动了的1k的dll了?当然,使用OAUS自己主动升级系统能够轻松地做到这一点。OAUS自己主动升级系统能够对被分发的client程序中的每一个文件进行版本号管理,每次升级的基础单元不再是整个client程序,而是当中的单个文件。

针对单个文件的更新,包含三种形式:

(1)文件被改动。

(2)文件被删除。

(3)新添加某个文件。

      OAUS对这三种形式的文件更新都是支持的。每次自己主动升级,都能够更改N个文件、删除M个文件、新添加L个文件。

二.OAUS的使用

1.OAUS的结构

      OAUS提供了可直接执行的服务端程序和client程序:AutoUpdaterSystem.Server.exe 和 AutoUpdater.exe。 OAUS服务端的目录结构例如以下所看到的:

           

      OAUS的client与server之间通过TCP通信,能够在AutoUpdaterSystem.Server.exe.config配置文件里配置server通过哪个TCPport提供自己主动升级服务。

      FileFolder目录初始是空的。其用于部署被分发的程序的各个文件的最新版本号。

注意。其下的文件结构一定要与被分发的程序正常部署后的结构全然一致 -- 即相当于在FileFolder目录下部署一个被分发的程序。

      OAUSclient的目录结构例如以下:      

      

       能够在AutoUpdater.exe.config配置文件里配置OAUSserver的IP、port等信息。其内容例如以下所看到的:

<configuration>
<appSettings>
<!--serverIP -->
<add key="ServerIP" value="127.0.0.1"/>
<!--serverport-->
<add key="ServerPort" value="4530"/>
<!--升级完毕后。将被回调的可执行程序的名称-->
<add key="CallbackExeName" value="Demo.exe"/>
<!--主窗口的Title-->
<add key="Title" value="文件更新"/>
</appSettings>
</configuration>

      请注意配置的CallbackExeName,其表示当升级完毕之后。将被启动的分发程序的exe的名称。

这个CallbackExeName配置的为什么是名称而不是路径了?这是由于使用和部署OAUSclient时是有要求的:

(1)被分发的程序的可执行文件exe必须位于部署目录的根目录。

(2)OAUS的client(即整个AutoUpdater目录)也必须位于这个根目录。

      如此,AutoUpdater就知道分发程序的exe相对自己的路径,如此就能够确定分发程序的exe的绝对路径,所以就能够在升级完毕后启动目标exe了。另外,依据上述的两个约定,再结合前面讲到的服务端的FileFolder目录的结构约定,当服务端更新一个文件时,AutoUpdater便能够确定该文件在client机器上的绝对路径了。

2. OAUS自己主动升级流程 

         以下我们就具体讲讲怎样使用OAUS来构建自己主动升级系统,大概的过程例如以下。

(1)执行OAUS服务端。     

           

(2)将被分发的client程序的所有内容放到OAUS服务端的FileFolder目录下。其结构与client程序正常部署后的结构要全然一致。我们以部署VideoChatSystem为例。 

       

(3)使用OAUS服务端为被分发的client程序的每一个文件生成默认版本号号,并创建版本号信息配置文件UpdateConfiguration.xml。这个配置文件也将被client使用。

         点击服务端界面上的“文件版本号管理”button,将弹出用于管理各个文件版本号的【文件版本号信息】窗口。       

   

   当用新版本号的文件覆盖老的文件后,点击“自己主动扫描”button,服务端就会检索FileFolder目录下文件的名称、大小、最后更新时间,然后得出本次更新结果:变化了几个文件、新增了几个文件、删除了几个文件。 自己主动扫描功能把之前的手动操作所有简化了。

 

        假设须要手动操作,能够这样做:

        双击列表中的随意一行,能够改动其相应文件的版本号的值(int类型的数值)。

注意,此列表中的版本号信息与文件的真实版本号属性(比方dll的版本号属性X.X.X.X)能够是没有不论什么联系的,列表中版本号的值仅仅是用于标记文件是否被改动。所以,文件每被改动一次,其列表中相应的版本号的值就应该有所增大。

       当关闭【文件版本号信息】窗口时。仅仅要有某个文件版本号变化。则“最后综合版本号”的值(int类型)会递增1。通过比較OAUS的client保存的“最后综合版本号”的值与OAUS的服务端最新的“最后综合版本号”的值,就能够高速地识别client是否已经是最新版本号了。

       另外,初次打开这个窗口时,将在OAUS服务端的目录下,自己主动生成一个版本号信息配置文件UpdateConfiguration.xml。并且。每当通过该窗口来设置某个文件的新版本号时,UpdateConfiguration.xml会自己主动同步更新。 

(4)将UpdateConfiguration.xml加入到OAUS的client程序(即上述的AutoUpdater的目录)中。

(5)在创建被分发的client的安装程序时。将OAUS的client(即AutoUpdater的目录)也打包进去,并且像前面说的一样,要将其直接部署在执行目录(BaseDirectory)下(与分发的exe同一目录)。

         如此,准备工作就完毕了,当client通过安装包安装好了VideoChatSystem之后。其目录结构像以下这样: 

       

(6)当我们有新的版本号要公布时。比方要更新某个文件(由于文件被改动),那么能够这样做:

    a.将改动后的文件复制到OAUS服务端的FileFolder目录下的正确位置(或覆盖旧的文件)。

    b.在OAUS服务端打开【文件版本号信息】窗口,双击被改动文件所相应的Row。在弹出的窗口上改动相应文件的版本号号,将版本号号的数值添加。(假设是删除旧文件或加入新文件,此处也可进行相应的操作)

(7)如此,当client再启动AutoUpdater.exe时,就会自己主动升级。更新那些发生变化的文件。 以下是AutoUpdater.exe执行起来后的截图。

      

(8)当升级完毕后,将启动前述的OAUSclient配置文件里配置的回调exe。(在本例中就是VideoChatSystem.exe)

(9)OAUSclient会在日志文件UpdateLog.txt(位于AutoUpdater的目录下。在OAUSclient首次执行时自己主动生成该文件)中。记录每次自己主动升级的情况。

(10)假设升级的过程中。与服务端连接中断,则会自己主动重连。在重连成功后,将启动断点续传。

     

       

3.何时启动自己主动升级client?

       假设某个系统是下载client形式的,那么client该怎样知道是否有新版本号了?然后又该何时启动AutoUpdater.exe了?

       我们的经验是这种:client登录成功之后,从server获取“最后综合版本号”的值。然后与本地的“最后综合版本号”的值相比較,假设本地的值较小,则表示client须要更新。这个过程能够这样做到:

(1)当在OAUS服务端的FileFolder目录下放置了新的文件。并通过【文件版本号信息】窗口正确的更新了版本号号,在关闭【文件版本号信息】窗口时,“最后综合版本号”的值会自己主动加1。

(2)系统client能够通过调用OAUS.Core.VersionHelper类的静态方法HasNewVersion()来推断是否有新版本号。

(3)假设HasNewVersion方法返回true,则通常有两种模式:由用户选择是否升级。或者是强制升级。

      一般而言,假设最新client程序与老版本号兼容,不升级也影响不大,则能够交由用户决定是否升级。假设最新client程序不兼容老版本号,或者是有重大更新,则将启动强制升级。假设流程要进入启动升级,那么仅仅要启动AutoUpdater的目录下AutoUpdater.exe就能够了。要注意的是,启动AutoUpdater.exe进程后。要退出当前的client进程,否则,有些文件会由于无法被覆盖而导致更新失败。代码大致例如以下所看到的: 

  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#实现自己主动升级(附源代码)的更多相关文章

  1. 【转】P2P之UDP穿透NAT的原理与实现(附源代码)

    作者:shootingstars (有容乃大,无欲则刚)  日期:2004-5-25 出处:P2P中国(PPcn.net) P2P 之 UDP穿透NAT的原理与实现(附源代码)原创:shootings ...

  2. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

    效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])    本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   ...

  3. 仿36氪(iOS版附源代码)

    前言: 这是我2016年3月开始写的,利用课余时间全心投入的项目,本以为是凭着轻松愉悦的方式来学习的,中途遇到bug解决bug的时候,每天晚上几乎都是写到寝室关灯,还有一次使用Github不当写了五天 ...

  4. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]

    原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...

  5. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  6. Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源代码

    上篇博客我们说Spring web Flow与业务结合的方式主要有三种,以下我们主要介绍一下第三种的应用方式 3,运行到<action-state> 元素 SpringWeb Flow 中 ...

  7. Cocos2d-x3.1下 Android,APK自己主动升级

    项目要做Android的自己主动升级,对于我们之前做iOS的转Cocos开发做Android方面的功能..... 不正确说了.这里记录下我的实现过程. 原文地址:http://blog.csdn.ne ...

  8. Android自己主动检測版本号及自己主动升级

    步骤: 1.检測当前版本号的信息AndroidManifest.xml-->manifest-->android:versionName. 2.从server获取版本号号(版本号号存在于x ...

  9. 基于事件驱动的DDD领域驱动设计框架分享(附源代码)

    原文:基于事件驱动的DDD领域驱动设计框架分享(附源代码) 补充:现在再回过头来看这篇文章,感觉当初自己偏激了,呵呵.不过没有以前的我,怎么会有现在的我和现在的enode框架呢?发现自己进步了真好! ...

随机推荐

  1. 虚拟机中试用windows 8(视频)

    虚拟机中试用windows 8(视频) VM7装windows 8基本没戏,建议用正式版vmware8.0,还有Oracle的Virtualbox 也没问题http://www.virtualbox. ...

  2. Android java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses

    项目开发快到尾声,突然发现之前一个模块莫名其妙的奔溃了,我的内心也是奔溃的.以前一直都是好好的,也没去动过它,为啥会出现这样的问题呢? 下面我会根据自己的理解来看待问题 android是怎么根据id查 ...

  3. Kinect 开发 —— 面部识别

    EmguCV库也能用来进行面部识别(face identify).实际的面部识别,就是将一张图像上的人物的脸部识别出来,这是个很复杂的过程,具体过程我们这里不讨论.对一幅影像进行处理来找到包含脸部的那 ...

  4. Flask的快速入门详细笔记

    Flask的框架结构对应关系及理解 1.简介 简单介绍下Flask是一个轻量级的web前端框架,不像django那样本身具备一套完整的页面体系,轻量级说明了完全可以自定义,从功能逻辑到业务处理,都可以 ...

  5. 【例题 8-15 UVA - 12174】Shuffle

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举第一段的范围[0..i] (0<=i<s) 然后看看[i+1..i+s-1],[i+s,i+s+s-1]..这些区间 ...

  6. Mysql学习总结(18)——Mysql主从架构的复制原理及配置详解

    一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...

  7. Java7与G1

    Lucene 4.8開始不支持java6了,所以在下次版本号升级之前我们要先升级至java7. 我使用1/3的全量索引(7.3G).进行測试,20并发,40万请求: sun jdk 1.6.0_26 ...

  8. Cocos2d-x 之大牛看法

    (未完毕) cocos2d-x并非一个适合网游client(mmo)的游戏引擎.越是大型游戏,这个小引擎就越无法驾驭(尽管它很受欢迎). 之前我在原来的公司使用的是自主研发的C3引擎,已经对外开放(尚 ...

  9. Web前端开发实战4:导航菜单(一)

    在前面的博文中我们提到横向一级菜单,这里我们来看看导航菜单. 导航菜单种类非常多,可是制作原理都是大同 小异的.这里看的比二级下拉式菜单还简单. 来看一些站点上的导航菜单: 垂直导航菜单: 水平导航菜 ...

  10. screen-调节屏幕亮度

    今天做项目的时候,需要实现一个功能,就是进入一个应用,在这个应用中,屏幕的亮度变为最亮.关键代码如下 bt1.setOnClickListener(new OnClickListener() { @O ...