推薦C#開發(fā)桌面自動(dòng)更新程序(服務(wù)端與客戶端)_第1頁
推薦C#開發(fā)桌面自動(dòng)更新程序(服務(wù)端與客戶端)_第2頁
推薦C#開發(fā)桌面自動(dòng)更新程序(服務(wù)端與客戶端)_第3頁
推薦C#開發(fā)桌面自動(dòng)更新程序(服務(wù)端與客戶端)_第4頁
推薦C#開發(fā)桌面自動(dòng)更新程序(服務(wù)端與客戶端)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本文以小型應(yīng)用的通用性自動(dòng)更新程序,開發(fā)的程序可以直接拿過來使用,非常方便。原理服務(wù)器端的結(jié)構(gòu)是這樣的:App_Dita@錄Update,asmx Download,ashx數(shù)據(jù)庫主程序及其他附屬文件生成的最新版本更新文件包App_Dita@錄Update,asmx Download,ashx數(shù)據(jù)庫主程序及其他附屬文件生成的最新版本更新文件包Upd^tE目錄其工作原理如下:Update.asmx僅提供一個(gè)功能,就是檢測是否需要更新,在需要更新的時(shí)候就返回一個(gè)更新地址,通常情況下返回的地址就是Download.ashx,而在某些特殊情況下,也可以修改服務(wù)端使之從其他Url提供更新下載。檢測是否需要更新的的具體做法是:首先獲取Updata目錄中的主程序版本號(hào),再獲取數(shù)據(jù)庫中的最新版本號(hào),兩者對(duì)比。如果相同則直接與客戶端提供的版本號(hào)相對(duì)比并返回結(jié)果;如果不同則將主程序版本號(hào)寫入數(shù)據(jù)庫,然后生成新的更新文件包,直接向客戶端返回更新地址。Download.ashx的功能僅僅是將最新版本更新文件包輸出。而客戶端部分包含主程序、Update.exe以及其他附屬文件,更新時(shí)由主程序檢測并下載更新,在主程序退出時(shí),如有更新并已成功下載,則調(diào)用Update.exe完成解包及更新覆蓋工作。需注意的是:Update.exe永遠(yuǎn)不能被更新,因?yàn)樗鼰o法更新其自身,所以服務(wù)端更新時(shí)也不要將Update.exe納入更新包。下面就是來實(shí)際編寫一個(gè)自動(dòng)更新解決方案:服務(wù)器端首先建立一個(gè)Web服務(wù)項(xiàng)目,項(xiàng)目名為“自動(dòng)更新服務(wù)”:

新建項(xiàng)目芻動(dòng)更新服務(wù)添加一數(shù)據(jù)庫,名為Database.mdf:.NETFramewo用于創(chuàng)建XMLWeb服務(wù)的項(xiàng)目(.NETFramework3.5]名稱㈣:C:\Users\SkyD\Documents\VisuaIStudio200趴Piroj已cts\^驗(yàn)室?>(□新建項(xiàng)目芻動(dòng)更新服務(wù)添加一數(shù)據(jù)庫,名為Database.mdf:.NETFramewo用于創(chuàng)建XMLWeb服務(wù)的項(xiàng)目(.NETFramework3.5]名稱㈣:C:\Users\SkyD\Documents\VisuaIStudio200趴Piroj已cts\^驗(yàn)室?>(□:項(xiàng)目類型]円:解CD:VisualC#Windows舞庫ReportingSilverlightWCFWorkflow測試DotfuscatorProjects具幀目翹測試項(xiàng)目ASP.NETWeb服務(wù)應(yīng)程序3|WCF黒務(wù)應(yīng)程^影雄數(shù)據(jù)實(shí)休Web應(yīng)扇融齷^稱的〕:^UpdateT&sT^^団創(chuàng)建解沃方塞的目錄[D]VisualStudio已寶裝的模板i(^ASP.NETWeb應(yīng)用程序^1ASP.NETAJAX服務(wù)器控件^1ASP.NET虛務(wù)器控件鬱詼曲gW哉應(yīng)程序克的槿板扇搜箕聯(lián)機(jī)模板…Web穆能設(shè)備VisualC#WebWindowsFormsWPF

帛規(guī)

代碼ExpressionBl已ndReportingSiIverlightWorkflowI」SQLServer數(shù)據(jù)庫劃牛我的模板一站搜縈蹴1模板…在數(shù)據(jù)庫中創(chuàng)建新的數(shù)據(jù)庫關(guān)系圖,并如下設(shè)計(jì)數(shù)據(jù)庫表:UpdateVersion列窖危午NullPublicTimedatetimenVersionnvarchar(50)n□創(chuàng)建一個(gè)Ado.NetEntityDataModel,名為Model.edmx:

從剛才的建立的數(shù)據(jù)庫中生成模型:◎gUpchteVersion?-躍融超PuiblicTime^Version-躺融在Web.Config的appSettings節(jié)點(diǎn)中新增兩個(gè)節(jié)點(diǎn),用以設(shè)置更新程序的主文件名及更新包下載地址:<appSettings>vaddkey="主程序文件名"value="MyApp.exe"/>vaddkey="更新包下載地址"value="Download.ashx"/>v/appSettings>引入一個(gè)GZip類用以打包(該類的源碼將在文章末尾隨本文示例源代碼一并提供):

GZFp?“””口System添加一個(gè)新的Web服務(wù),名為Update.asmx:書寫如下代碼:[WebMethod]publicstringGetUpdate(stringClientVerison){if(獲取最新版本()!=ClientVerison){returnSystem.Web.Configuration.WebConfigurationManager.AppSettings「更新包下載地址"];}returnnull;}staticstring獲取最新版本(){string v = 獲 取 文 件 版 本(HttpContext.Current.Server.MapPath(string.Format("~/App_Data/Update/{0}",、旱]彼皿石&RJ、旱]彼皿石&RJ他憂丄冃:團(tuán)站點(diǎn)地囹我的模板 System.Web.Configuration.WebConfigurationManager.AppSettings[主程序文件名"])));using(varc=newDatabaseEntities()){//從數(shù)據(jù)庫取得最新版本信息varq=c.UpdateVersion.OrderByDescending(f=>f.PublicTime).FirstOrDefault();if(q==null||v!=q.Version){//數(shù)據(jù)庫中的版本與當(dāng)前主程序版本不一致時(shí),以主程序版本為準(zhǔn),寫入數(shù)據(jù)庫,并生成新的更新文件包vard=newUpdateVersion(){Version=v,PublicTime=DateTime.Now};c.AddToUpdateVersion(d);c.SaveChanges();打包更新文件(HttpContext.Current.Server.MapPath("?/App_Data/Update/"),HttpContext.Current.Server.MapPath("~/App_Data/Update.gzip"));}}returnv;}publicstaticvoid打包更新文件(string打包目錄,string輸出文件){GZip.壓縮(輸出文件,Directory.GetFiles(打包目錄).Concat(Directory.GetDirectories(打包目錄)).ToArray());}publicstaticstring獲取文件版本(string文件路徑){FileVersionInfof=FileVersionInfo.GetVersionInfo文件路徑);returnf.FileVersion;件包}創(chuàng)建Download.ashx,用以輸出更件包rkflow代碼:publicvoidProcessRequest(HttpContextcontext){

context.Response.ContentType="application/zip";context.Response.WriteFile(context.Server.MapPath("~/App_Data/Update.gzip"));}服務(wù)端至此就編寫完畢了??蛻舳诵陆ㄒ粋€(gè)WinForm應(yīng)用程序項(xiàng)目,名為Update:jalC#WindowsWeb智jalC#WindowsWeb智首韻備娠庫ReportingSilverlightWCFWorkflow測試fuscatorProjects頸目類型頃目控制合壷程序壓|WPF用戶控件庫囲空項(xiàng)目我此摸板畐搜縈麻機(jī)模板墓具有Windows窗墓具有Windows窗it用戶界面的應(yīng)用程序的項(xiàng)目[.NETFramework3.5)建好之后直接刪掉Forml.cs吧,此程序不需要界面,在Program.cs中寫代碼就可以了。同樣需要引入GZip類用于解包:£)■■■—E■用GZip?“””口System然后編寫代碼:[STAThread]staticvoidMain(){try{vard=DateTime.Now;while(DateTime.Now.Subtract(d).TotalSeconds<l0)Application.DoEvents();

GZip.解壓縮(Path.Combine(Application.StartupPath,"update.data"),Application.StartupPath);}catch{}}這里的作用就是等待10秒,然后解包update.data文件,覆蓋到當(dāng)前目錄中。現(xiàn)在來建立主程序,主程序是WinForm、命令行、WPF都可以,我們新建一個(gè)WPF應(yīng)用程序,命名為MyAPP:舊奕型LJ: 棋飯〔I》:VisualC#WindowsWeb智能設(shè)備站庫ReportingSilverlightWCFWorkflowDotfuscatorProjects具阿目翹目VindowsPresentationFoundation客戶靖(.NETFramework3.為程序添加服務(wù)引用:u! Irx. !-

為程序添加服務(wù)引用:添加報(bào)務(wù)引用若要查著持倉艮務(wù)器上的可羽服務(wù)列表r請(qǐng)輸入服務(wù)URLr然后單擊”轉(zhuǎn)到”t若要添加報(bào)務(wù)引用若要查著持倉艮務(wù)器上的可羽服務(wù)列表r請(qǐng)輸入服務(wù)URLr然后單擊”轉(zhuǎn)到”t若要瀏覽可用的脈擊“發(fā)現(xiàn)“.地址陽^GetUpdate在地址"http://l□caIhost:50267/Update.asmv"處找到1個(gè)服務(wù)?命名空間(N]:前往⑹服務(wù)⑸:援作Q):ServiceRefersnce|http://loc£Iho§t:;50267/Upd呂七已日Binnix佛疋UpdateSoapQ-@甸Update1...護(hù)這里的地址使用的是本地的調(diào)試地址。為了檢測主程序自身的版本號(hào),還需要添加對(duì)System.Windows.Forms的引用。然后開始設(shè)計(jì)界面,這里僅為演示更新操作,所以界面上只是簡單的設(shè)計(jì)了更新相關(guān)的提示操作控件:Windowl代碼為:<Windowx:Class="MyApp.Window1"xmlns="/winfx/2006/xaml/presentation"xmlns:x="/winfx/2006/xaml"Title="Window1"Height="300"Width="377"Loaded="Window_Loaded"Closed="Window_Closed"><Grid><Grid.RowDefinitions><RowDefinitionHeight="1*"/><RowDefinitionHeight="1*"/><RowDefinitionHeight="1*"/></Grid.RowDefinitions><LabelMargin="0"Name="label1"HorizontalAlignment="Center"VerticalAlignment="Center"Visibility="Hidden">^測到新版本,是否下載?v/Label><ButtonGrid.Row="1"Height="23"Name="button1"VerticalAlignment="Center"Visibility="Hidden"Click="buttonl_Click">#始下載</Button〉<LabelGrid.Row="2"Margin="0"Name="label2"VerticalAlignment="Center"HorizontalAlignment="Center"Visibility="Hidden">更新包已下載完畢,在程序關(guān)閉后將自動(dòng)執(zhí)行更新操作。</Label></Grid></Window>需注意的是,這里控件都被設(shè)置為Visibility="Hidden",我們將會(huì)在需要時(shí)再將其顯示出來。編寫后臺(tái)代碼:publicUriDownloadUri{get{return_DownloadUri;}set{_DownloadUri=value;}}privateUri_DownloadUri;publicboolUpdateReady{get{return_UpdateReady;}set{_UpdateReady=value;}}privatebool_UpdateReady;privatevoidWindow_Loaded(objectsender,RoutedEventArgse){varu=newMyApp.ServiceReference.UpdateSoapClient();vars=u.GetUpdate(System.Windows.Forms.Application.ProductVersion);if(!string.IsNullOrEmpty(s)){〃獲取相對(duì)于Web服務(wù)所在Uri的UriDownloadUri=newUri(u.Endpoint.ListenUri,s);label1.Visibility=button1.Visibility=Visibility.Visible;}}privatevoidbutton1_Click(objectsender,RoutedEventArgse){varc=newWebClient();c.DownloadFile(DownloadUri,System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath,"update.data"));UpdateReady=true;label2.Visibility=Visibility.Visible;

privatevoidWindow_Closed(objectsender,EventArgse){if(UpdateReady){Process.Start(System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath,"update.exe"));}}測試現(xiàn)在將主程序、附屬文件和Update.exe放在一起,并將主程序及附屬文件復(fù)制一份放到服務(wù)器端的App_data/Update/目錄中,再添加一個(gè)“更新說明.txt”:isualStudio2008卜Projects卜實(shí)驗(yàn)室卜UpdateTest卜弓動(dòng)更新服務(wù)卜App_Data卜Update 〒好文檔庫Update丿今天⑶MyApp.exeMyApp10.0.0MyApp.exe.conXMLConfigurai1.60KBMyApp.exe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論