天天看點

如何實作自動更新?

        對于PC桌面應用程式而言,自動更新功能往往是必不可少的。而自動更新可以作為一個獨立的C/S系統來開發,這樣,就可以在不同的桌面應用中進行複用。基于ESFramework的檔案傳送功能,我實作了一個可直接複用的自動更新系統OAUS,現在将其分享給大家。這篇文章将着重介紹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服務端。     

如何實作自動更新?

      服務端主界面将顯示所有正在自動更新的OAUS用戶端資訊。

(2)将被分發的用戶端程式的所有内容放到OAUS服務端的FileFolder檔案夾下,其結構與用戶端程式正常部署後的結構要完全一緻。我們以部署VideoChatSystem為例。 

如何實作自動更新?

(3)使用OAUS服務端為被分發的用戶端程式的每個檔案生成預設版本号,并建立版本資訊配置檔案UpdateConfiguration.xml。這個配置檔案也将被用戶端使用。

      點選服務端【工具】菜單欄下的【版本管理】子菜單,将彈出用于管理各個檔案版本的【檔案版本資訊】窗體。         

如何實作自動更新?

      輕按兩下清單中的任意一行,可以修改其對應檔案的版本的值(float類型的數值)。注意,此清單中的版本資訊與檔案的真實版本屬性(比如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用戶端首次運作時自動生成該檔案)中,記錄每次自動更新的情況。

3.何時啟動自動更新用戶端?

      假設某個系統是下載下傳用戶端形式的,那麼用戶端該如何知道是否有新版本了?然後又該何時啟動AutoUpdater.exe了?

      我們的經驗是這樣的:用戶端登入成功之後,從伺服器擷取“最後綜合版本”的值,然後與本地的“最後綜合版本”的值相比較,如果本地的值較小,則表示用戶端需要更新。這個過程可以這樣做到:

(1)當在OAUS服務端的FileFolder檔案夾下放置了新的檔案,并通過【檔案版本資訊】窗體正确的更新了版本号,在關閉【檔案版本資訊】窗體時,“最後綜合版本”的值會自動加1。

(2)系統用戶端可以通過調用AutoUpdater.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(可直接部署)

  如果有任何建議或問題,請留言給我。

繼續閱讀