天天看點

.NET實作之(自動更新)

做開發的人,尤其是做用戶端(C/S)系統開發的人都會遇到一個頭疼的問題,就是軟體的自動更新;系統釋出後怎樣自動的更新程式,在下有幸開發過一個自動更新程式,更新程式與任何宿主程式是完全獨立的;隻要在主程式裡面啟動更新程式就行了;更新程式也是一個可執行檔案,在啟動的時候可以設定是否是自動更新和是否是手動更新,自動更新的意思就是說不需要人工的幹預實作從遠端伺服器下載下傳更新包,而如果是手動更新就會涉及到使用者點選程式中的按鈕實作更新;在自動更新與手動更新中可以根據項目的需要進行選擇,有的程式必須要求使用者進行更新才能繼續使用,是以程式自動更新是有必要的;手動更新就是使用者可以随時更新程式,不需要嚴格的控制版本問題;下面本人就來講一下具體的實作細節,我貼出部分代碼,源碼屬公司财産本人不宜上傳;

自動更新的目的就是将伺服器上的DLL檔案拷貝到本地執行目錄中,并且覆寫本地同名的檔案;流程很簡單,但是實作起來有幾個地方需要注意:

1.大批量的DLL檔案怎麼下載下傳到本地來,有多個DLL檔案在下載下傳過程中如果網速慢的情況下可能出現丢包、丢檔案等情況;本人的實作是将多個檔案通過ICSharpCode.SharpZipLib元件進行打包,這樣可以省很多事;(如:動态連接配接庫檔案dll的名稱在傳輸過程中大小寫可能會變化)

2.下載下傳到本地了,怎麼覆寫原有的同名檔案;本人的實作是先同名的檔案的支援删除,然後解壓縮;這個過程需要臨時儲存删除的檔案,防止操作失敗程式無法啟動,要注意有事務性的原理;

3.如果更新的檔案不隻是單單的DLL檔案可能還有一些無限極的檔案夾;本人的實作是如果存在同名的檔案夾,直接遞歸的删除,然後将其解壓縮到目錄中;由于壓縮包解壓後的頂級目錄是壓縮檔案的名稱,所有在複制的過程中需要注意目錄的層次關系;

下面我們來走一下實作的整個流程,雖然沒有給出整個源碼,但是如果看完這篇文章的你基本實作起來沒什麼大問題了;

為了部署友善我建議大家麻煩點實作一個部署檔案的工具,将所有的檔案直接打包在裡面同時生成伺服器端的版本資訊檔案;

.NET實作之(自動更新)

利用這個工具就很友善的實作了對檔案進行壓縮、生成HASH值、版本檔案、更新位址等資訊;

.NET實作之(自動更新)

這個XML中儲存的是服務目前的版本資訊、更新檔案的名稱、更新檔案的HASH值,為什麼需要HASH就是怕更新檔案在某些情況下被人調包了,如果所有的用戶端更新後後果很嚴重;是以我們必須帶上HASH值;

.NET實作之(自動更新)
.NET實作之(自動更新)

工具生成兩個檔案,一個是版本檔案一個是更新包,伺服器的任務已經完成,下面就是具體的用戶端的實作;

為了知道何時需要進行版本更新是以要在用戶端程式目錄中儲存一份用來記錄版本資訊的檔案;

.NET實作之(自動更新)

檔案中儲存着目前本地的版本号、伺服器的更新位址、宿主程式的名稱,需要宿主的名稱就能在更新的時候将宿主程式重程序中枚舉出來然後關掉,這樣就不影響我們更新了,當然也可以實作宿主程式不關閉的情況下更新,如果用到某些已經被宿主程式占用的情況會直接影響更新流程,是以以防萬一關了為妙;

.NET實作之(自動更新)

這是用戶端版本檔案中儲存的資訊;

我們上面說了,更新分為手動和自動,我們先來說手動更新吧,手動更新就是需要使用者自己去點選更新按鈕然後開始更新,這個問題我們可以利用程序的參數傳遞解決;

.NET實作之(自動更新)

當然在更新程式裡面需要有這方面的邏輯判斷;

.NET實作之(自動更新)

入口的地方我們進行判斷,更新方式;這裡的下載下傳遠端更新包是用WebClient對象,也可以用其他的基于Socket的對象;更新開始之前需要先判斷本地的版本号是否小于遠端版本号,如果小于在進行更新;

.NET實作之(自動更新)

因為下載下傳的過程是異步的是以需要用到背景線程建議大家使用System.ComponentModel.BackgroundWorker這個背景線程對象,他對Thread進行了很好的封裝;下面來看一下核心的流程代碼:

這部分代碼是串聯整個過程的代碼;

自動更新大概就講完了,幾個關鍵的地方都給出了,希望對大家開發自動更新程式有幫助;

繼續閱讀