眾所周知,對于一般的軟件開發(fā),在開始的時候都會有一個技術選型的階段,最大的選型就是首先要確定是選擇Client/Server模式還是Browser/Server模式。綜合而論:兩者各有優(yōu)劣,在很多方面都不能被對方互相取代,如在適用Internet、維護工作量等方面,B/S比C/S要強很多;但在運行速度、數(shù)據(jù)安全、人機交互等方面,B/S就遠不如C/S那么強大。所以綜上所述,凡是C/S的強項,便是B/S的弱項,反之亦然。由于今天討論的是自動更新組件,所以接下來我們就往這方面細講,既然C/S模式在運行速度、數(shù)據(jù)安全、人機交互有這么多的優(yōu)點,尤其是客戶端技術日益發(fā)展的今天,如何解決客戶端的部署與自動升級問題便是一個非常重要的問題。二. 本文提綱
· 1.摘要
· 2.本文提綱
· 3.為什么不使用ClickOnce
· 4.簡要介紹
· 5.項目中如何使用
· 6.具體效果
· 7.維護與下載
· 8.總結 三. 為什么不使用ClickOnce
在前面的摘要中我們簡單介紹了自動更新功能的重要性,在這一小節(jié)里我們來談一下為什么不使用微軟給我們提供的自動更新組件ClickOnce,大家都知道ClickOnce給我們提供了很多功能:簡單說來,ClickOnce 應用程序就是任何使用 ClickOnce 技術發(fā)布的 Windows 窗體或控制臺應用程序?梢圆捎萌N不同的方法發(fā)布 ClickOnce 應用程序:從網(wǎng)頁發(fā)布、從網(wǎng)絡文件共享發(fā)布或是從媒體(如 CD-ROM)發(fā)布。ClickOnce 應用程序既可以安裝在最終用戶的計算機上并在本地運行(即使當計算機脫機時也可以運行),也可以僅以聯(lián)機模式運行,而不在最終用戶的計算機上永久安裝任何內容。ClickOnce 應用程序可以自行更新;這些應用程序可以在較新版本變?yōu)榭捎脮r檢查較新版本,并自動替換所有更新的文件。開發(fā)人員可以指定更新行為;網(wǎng)絡管理員也可以控制更新策略,如將更新標記為強制性的。最終用戶或管理員還可以對更新進行回滾,使應用程序恢復到早期的版本。
從上面大家可以看出ClickOnce 無疑是微軟對Client/Server模式部署的最佳解決方案,但正是因為它的功能特別強大而且又要使用相當簡單,所以在產(chǎn)品的封裝上就特別嚴實,基本上就暴露了一些簡單的操作接口,這樣就無形把一些定制化的操作拒之于門外,比如:1,用戶不能自己指定安裝路徑。 2,對自動更新流程不能做定制化的操作。 3,對自動更新的UI不能定制化的設計。
正因為這幾個原因,所以很多企業(yè)都會做一些定制化的組件來實現(xiàn)自動更新的功能,基于此,我們這里也實現(xiàn)了一個非常簡單的自動更新組件.四. 簡要介紹
其實自動更新的原理很簡單,分析起來無非就是簡單的幾步操作,當然實現(xiàn)方式也是大同小異,這里我們就選一種較簡單的方式:1.啟動主程序,主程序里面調用升級程序,升級程序連接到IIS或者FTP。 2.升級程序獲取服務器端XML配置文件中新版本程序的更新日期或版本號或文件大小。 3.升級程序獲取原有客戶端應用程序的最近一次更新日期或版本號或文件大小,然后兩者進行比較;如果新版本日期>原有程序的最新日期,則提示用戶是否升級;或如果新版本版本號>原有程序的版本號,則提示用戶是否升級;再或如果新版本文件大小>原有程序的文件大小,則提示用戶是否升級。本文主要采用一般的做法,就是通過版本號來進行對比。 4.如果用戶選擇升級,則獲取下載文件列表; 5.在本地建立與遠程IIS或者FTP相應的臨時目錄,然后下載到這個臨時目錄文件下; 6.刪除舊的主程序,拷貝臨時文件夾中的文件到相應的位置; 8.結束升級流程并重新啟動主程序。
根據(jù)前面的流程,我們可以簡單設計如下的項目:
圖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更新的版本到服務器
如果需要讓客戶端獲取最新的版本,首先我們需要開發(fā)人員編譯源代碼并生成文件,然后拷貝到FTP或者IIS目錄下,運行一個自動生成XML文件的程序,把所有的文件都自動生成到一個XML文件,詳細見下圖: 圖2
第二步:配置本地的Config
經(jīng)過第一步的流程,這一步要做的就是配置本地的Config用于監(jiān)測并下載遠程IIS或者FTP下需要更新的文件,具體如下圖所示:
圖3
第三步:修改主程序
首先把AutoUpdater這個DLL引入我們的主項目,然后在主項目中添加如下代碼,當然你可以根據(jù)自己的需要進行書寫,這個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按鈕跳過并繼續(xù)主程序流程,反之則進入如下頁面。
圖5
在下載的過程中,用戶可以選擇Cancel停止下載并重新回到主流程。七. 維護與下載
該組件已經(jīng)托管到CodePlex,所以大家可以到上面下載其源代碼,具體地址:http://autoupdater.codeplex.com/
圖6八. 總結
我們這篇文章簡單的講解了一個簡單的自動更新組件,由于它比較簡單而且功能單一,所以沒有花費大量的篇幅進行論述,感興趣的讀者可以下載其源碼。后面我會把自己開發(fā)的一套MVVM框架也托管上去,由于目前對Silverlight的支持還不太好,所以正在持續(xù)做相關的改進,其中借鑒了一些其他優(yōu)秀框架的思想并且融入了一些實際應用場景,所以到時也希望大家能夠多多指教! |