本文将示範一種桌面程式自動更新方案,其步驟比較多,但原理非常簡單,通用性尚可,對于小型應用來說,直接拿去就可以用了。
伺服器端的結構是這樣的:
其工作原理如下:
Update.asmx僅提供一個功能,就是檢測是否需要更新,在需要更新的時候就傳回一個更新位址,通常情況下傳回的位址就是Download.ashx,而在某些特殊情況下,也可以修改服務端使之從其他Url提供更新下載下傳。檢測是否需要更新的的具體做法是:首先擷取Updata目錄中的主程式版本号,再擷取資料庫中的最新版本号,兩者對比。如果相同則直接與用戶端提供的版本号相對比并傳回結果;如果不同則将主程式版本号寫入資料庫,然後生成新的更新檔案包,直接向用戶端傳回更新位址。
Download.ashx的功能僅僅是将最新版本更新檔案包輸出。
而用戶端部分包含主程式、Update.exe以及其他附屬檔案,更新時由主程式檢測并下載下傳更新,在主程式退出時,如有更新并已成功下載下傳,則調用Update.exe完成解包及更新覆寫工作。需注意的是:Update.exe永遠不能被更新,因為它無法更新其自身,是以服務端更新時也不要将Update.exe納入更新包。
下面就是來實際編寫一個自動更新解決方案:
首先建立一個Web服務項目,項目名為“自動更新服務”:
添加一資料庫,名為Database.mdf:
在資料庫中建立新的資料庫關系圖,并如下設計資料庫表:
建立一個Ado.Net Entity Data Model,名為Model.edmx:
從剛才的建立的資料庫中生成模型:
在Web.Config的appSettings節點中新增兩個節點,用以設定更新程式的主檔案名及更新包下載下傳位址:
引入一個GZip類用以打包(該類的源碼将在文章末尾随本文示例源代碼一并提供):
添加一個新的Web服務,名為Update.asmx:
書寫如下代碼:
代碼:
<a href="http://11011.net/software/vspaste" target="_blank"></a>
服務端至此就編寫完畢了。
建立一個WinForm應用程式項目,名為Update:
建好之後直接删掉Form1.cs吧,此程式不需要界面,在Program.cs中寫代碼就可以了。
同樣需要引入GZip類用于解包:
然後編寫代碼:
這裡的作用就是等待10秒,然後解包update.data檔案,覆寫到目前目錄中。
現在來建立主程式,主程式是WinForm、指令行、WPF都可以,我們建立一個WPF應用程式,命名為MyAPP:
為程式添加服務引用:
這裡的位址使用的是本地的調試位址。
為了檢測主程式自身的版本号,還需要添加對System.Windows.Forms的引用。
然後開始設計界面,這裡僅為示範更新操作,是以界面上隻是簡單的設計了更新相關的提示、操作控件:
代碼為:
需注意的是,這裡控件都被設定為Visibility="Hidden",我們将會在需要時再将其顯示出來。
編寫背景代碼:
現在将主程式、附屬檔案和Update.exe放在一起,并将主程式及附屬檔案複制一份放到伺服器端的App_data/Update/目錄中,再添加一個“更新說明.txt”:
然後啟動用戶端程式進行測試,應該看到程式界面裡什麼都沒有,因為用戶端和伺服器端程式版本是一緻的。
現在我們修改用戶端版本号為1.0.0.1:
然後重新編譯程式。
因為伺服器僅僅是判斷版本号是否不同,而不是哪個更高,是以不僅僅是更新,降級更新也是可以的,我們來測試一下:
找到所謂的新版本了^^,點開始下載下傳:
下載下傳完成,這時目錄裡就有update.data這個檔案了。
現在關閉程式,等待10秒,讓Update.exe完成更新:
可以看到,程式被降級為1.0.0.0了,而且那個“更新說明.txt”也被更新出來了。
本文轉自斯克迪亞部落格園部落格,原文連結:http://www.cnblogs.com/SkyD/archive/2009/12/21/1628566.html,如需轉載請自行聯系原作者