一. 摘要
前兩天在博客上發佈了一篇英文的自動更新組件文章Release a AutoUpdater tool,那麼在這篇文章中,咱們也對其功能進行一些簡單說明,這個組件很是簡單,因此你們能夠下載進行一些改進。衆所周知,對於通常的軟件開發,在開始的時候都會有一個技術選型的階段,最大的選型就是首先要肯定是選擇Client/Server模式仍是Browser/Server模式。綜合而論:二者各有優劣,在不少方面都不能被對方互相取代,如在適用Internet、維護工做量等方面,B/S比C/S要強不少;但在運行速度、數據安全、人機交互等方面,B/S就遠不如C/S那麼強大。因此綜上所述,凡是C/S的強項,即是B/S的弱項,反之亦然。因爲今天討論的是自動更新組件,因此接下來咱們就往這方面細講,既然C/S模式在運行速度、數據安全、人機交互有這麼多的優勢,尤爲是客戶端技術日益發展的今天,如何解決客戶端的部署與自動升級問題即是一個很是重要的問題。html
二. 本文提綱
· 1.摘要安全
· 2.本文提綱服務器
· 3.爲何不使用ClickOnce網絡
· 4.簡要介紹app
· 5.項目中如何使用框架
· 6.具體效果post
· 7.維護與下載spa
· 8.總結設計
三. 爲何不使用ClickOnce
在前面的摘要中咱們簡單介紹了自動更新功能的重要性,在這一小節裏咱們來談一下爲何不使用微軟給咱們提供的自動更新組件ClickOnce,你們都知道ClickOnce給咱們提供了不少功能:簡單說來,ClickOnce 應用程序就是任何使用 ClickOnce 技術發佈的 Windows 窗體或控制檯應用程序。能夠採用三種不一樣的方法發佈 ClickOnce 應用程序:從網頁發佈、從網絡文件共享發佈或是從媒體(如 CD-ROM)發佈。ClickOnce 應用程序既能夠安裝在最終用戶的計算機上並在本地運行(即便當計算機脫機時也能夠運行),也能夠僅以聯機模式運行,而不在最終用戶的計算機上永久安裝任何內容。ClickOnce 應用程序能夠自行更新;這些應用程序能夠在較新版本變爲可用時檢查較新版本,並自動替換全部更新的文件。開發人員能夠指定更新行爲;網絡管理員也能夠控制更新策略,如將更新標記爲強制性的。最終用戶或管理員還能夠對更新進行回滾,使應用程序恢復到早期的版本。3d
從上面你們能夠看出ClickOnce 無疑是微軟對Client/Server模式部署的最佳解決方案,但正是由於它的功能特別強大並且又要使用至關簡單,因此在產品的封裝上就特別嚴實,基本上就暴露了一些簡單的操做接口,這樣就無形把一些定製化的操做拒之於門外,好比:
1,用戶不能本身指定安裝路徑。
2,對自動更新流程不能作定製化的操做。
3,對自動更新的UI不能定製化的設計。
正由於這幾個緣由,因此不少企業都會作一些定製化的組件來實現自動更新的功能,基於此,咱們這裏也實現了一個很是簡單的自動更新組件.
四. 簡要介紹
其實自動更新的原理很簡單,分析起來無非就是簡單的幾步操做,固然實現方式也是大同小異,這裏咱們就選一種較簡單的方式:
1.啓動主程序,主程序裏面調用升級程序,升級程序鏈接到IIS或者FTP。
2.升級程序獲取服務器端XML配置文件中新版本程序的更新日期或版本號或文件大小。
3.升級程序獲取原有客戶端應用程序的最近一次更新日期或版本號或文件大小,而後二者進行比較;若是新版本日期>原有程序的最新日期,則提示用戶是否升級;或若是新版本版本號>原有程序的版本號,則提示用戶是否升級;再或若是新版本文件大小>原有程序的文件大小,則提示用戶是否升級。本文主要採用通常的作法,就是經過版本號來進行對比。
4.若是用戶選擇升級,則獲取下載文件列表;
5.在本地創建與遠程IIS或者FTP相應的臨時目錄,而後下載到這個臨時目錄文件下;
6.刪除舊的主程序,拷貝臨時文件夾中的文件到相應的位置;
8.結束升級流程並從新啓動主程序。
根據前面的流程,咱們能夠簡單設計以下的項目:
圖1
具體類介紹:
IAutoUpdater.cs 提供外部調用的接口
AutoUpdater.cs 該組件的主操做類
Autoupdater.config 本地配置文件
DownloadConfirm.cs 提示是否有更新頁面
DownloadProgress.cs 下載進度頁面
CommonUnitity.cs 一些經常使用功能
Config.cs 當更新完畢以後須要更新Config,因此這裏須要一個提供序列化的Config類
ConstFile.cs 一些常量文件
DownloadFileInfo.cs 須要下載的文件實體類
LocalFile.cs 本地文件實體類
RemoteFile.cs 遠程文件實體類
UpdateFileList.cs 本地的實體類集合
代碼很是簡單,具體能夠下載進行查看,因此這裏就不作過多闡述。
五. 項目中如何使用
第一步:Host更新的版本到服務器
若是須要讓客戶端獲取最新的版本,首先咱們須要開發人員編譯源代碼並生成文件,而後拷貝到FTP或者IIS目錄下,運行一個自動生成XML文件的程序,把全部的文件都自動生成到一個XML文件,詳細見下圖:
第二步:配置本地的Config
通過第一步的流程,這一步要作的就是配置本地的Config用於監測並下載遠程IIS或者FTP下須要更新的文件,具體以下圖所示:
圖3
第三步:修改主程序
首先把AutoUpdater這個DLL引入咱們的主項目,而後在主項目中添加以下代碼,固然你能夠根據本身的須要進行書寫,這個DLL提供了兩個外部接口,一個接口用於判斷是否有更新及下載,另外一個接口則是用於更新出錯時進行回滾操做,具體代碼以下:
#region check and download new version program bool bHasError = false; IAutoUpdater autoUpdater = new AutoUpdater(); try { autoUpdater.Update(); } catch (WebException exp) { MessageBox.Show("Can not find the specified resource"); bHasError = true; } catch (XmlException exp) { bHasError = true; MessageBox.Show("Download the upgrade file error"); } catch (NotSupportedException exp) { bHasError = true; MessageBox.Show("Upgrade address configuration error"); } catch (ArgumentException exp) { bHasError = true; MessageBox.Show("Download the upgrade file error"); } catch (Exception exp) { bHasError = true; MessageBox.Show("An error occurred during the upgrade process"); } finally { if (bHasError == true) { try { autoUpdater.RollBack(); } catch (Exception) { //Log the message to your file or database } } } #endregion
使用就是這麼簡單,更詳細的操做,你們能夠下載源碼,也正由於它的簡單,因此你們能夠對其修改以知足具體項目的需求。
六. 具體效果
當咱們運行主程序(WinForm或者WPF),若是服務器上有最新的版本,就會彈出以下頁面進行提示並讓用戶選擇是否更新。
圖4
當用戶不須要更新時,能夠選擇Skip按鈕跳過並繼續主程序流程,反之則進入以下頁面。
圖5
在下載的過程當中,用戶能夠選擇Cancel中止下載並從新回到主流程。
七. 維護與下載
該組件已經託管到CodePlex,因此你們能夠到上面下載其源代碼,具體地址:http://autoupdater.codeplex.com/
圖6
八. 總結
咱們這篇文章簡單的講解了一個簡單的自動更新組件,因爲它比較簡單並且功能單一,因此沒有花費大量的篇幅進行論述,感興趣的讀者能夠下載其源碼。後面我會把本身開發的一套MVVM框架也託管上去,因爲目前對Silverlight的支持還不太好,因此正在持續作相關的改進,其中借鑑了一些其餘優秀框架的思想而且融入了一些實際應用場景,因此到時也但願你們可以多多指教!