(最新OAUS版本請參見:自動升級系統OAUS的設計與實現(續))html
對於PC桌面應用程序而言,自動升級功能每每是必不可少的。而自動升級能夠做爲一個獨立的C/S系統來開發,這樣,就能夠在不一樣的桌面應用中進行復用。基於ESFramework的文件傳送功能,我實現了一個可直接複用的自動升級系統OAUS,如今將其分享給你們。這篇文章將着重介紹OAUS的相關背景、使用方法,至於詳細的實現細節,你們能夠直接下載源碼研究。若是瞭解了OAUS的使用,源碼的理解就很是容易了。若是須要直接部署使用自動升級系統,那麼,可下載文末的可執行程序壓縮包。服務器
目前主流的程序自動升級策略是,從新下載最新的安裝包,而後從新安裝整個客戶端。這種方式雖然簡單直觀,可是缺陷也很明顯。好比,即便整個客戶端有100M,而本次更新僅僅只是修改了一個1k大小的dll,那也意味着要從新下載100M的所有內容。這對帶寬是極大的浪費,並且延長了升級了時間,相應地也增長了客戶茫然等待的時間。app
在上述的場景中,自動升級時,咱們可否只更新那個被修改了的1k的dll了?固然,使用OAUS自動升級系統能夠輕鬆地作到這一點。OAUS自動升級系統能夠對被分發的客戶端程序中的每一個文件進行版本管理,每次升級的基礎單元再也不是整個客戶端程序,而是其中的單個文件。針對單個文件的更新,包括三種形式:ide
(1)文件被修改。工具
(2)文件被刪除。spa
(3)新增長某個文件。設計
OAUS對這三種形式的文件更新都是支持的。每次自動升級,均可以更改N個文件、刪除M個文件、新增長L個文件。日誌
OAUS提供了可直接執行的服務端程序和客戶端程序:AutoUpdaterSystem.Server.exe 和 AutoUpdater.exe。 OAUS服務端的目錄結構以下所示:code
OAUS的客戶端與服務器之間經過TCP通訊,能夠在AutoUpdaterSystem.Server.exe.config配置文件中配置服務器經過哪一個TCP端口提供自動升級服務。xml
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即可以肯定該文件在客戶端機器上的絕對路徑了。
下面咱們就詳細講講如何使用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客戶端首次運行時自動生成該文件)中,記錄每次自動升級的狀況。
假設某個系統是下載客戶端形式的,那麼客戶端該如何知道是否有新版本了?而後又該什麼時候啓動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); ......//退出當前進程
}
若是有任何建議或問題,請留言給我。