推薦C開(kāi)發(fā)桌面自動(dòng)更新程序服務(wù)端與客戶端_第1頁(yè)
推薦C開(kāi)發(fā)桌面自動(dòng)更新程序服務(wù)端與客戶端_第2頁(yè)
推薦C開(kāi)發(fā)桌面自動(dòng)更新程序服務(wù)端與客戶端_第3頁(yè)
推薦C開(kāi)發(fā)桌面自動(dòng)更新程序服務(wù)端與客戶端_第4頁(yè)
推薦C開(kāi)發(fā)桌面自動(dòng)更新程序服務(wù)端與客戶端_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余13頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、本文以小型應(yīng)用的通用性自動(dòng)更新程序,開(kāi)發(fā)的程序可以直接拿過(guò)來(lái)使用,非常方便。原理服務(wù)器端的結(jié)構(gòu)是這樣的:AppDHa目錄UpdataasEXDownload.ashx數(shù)據(jù)庫(kù)Update目錄生成的最新版本更新文件包主程序及其他附屬文件其工作原理如下:Update.asmx僅提供一個(gè)功能,就是檢測(cè)是否需要更新,在需要更新的時(shí)候就返回一個(gè)更新地址,通常情況下返回的地址就是Download.ashx,而在某些特殊情況下,也可以修改服務(wù)端使之從其他Url提供更新下載。檢測(cè)是否需要更新的的具體做法是:首先獲取Updata目錄中的主程序版本號(hào),再獲取數(shù)據(jù)庫(kù)中的最新版本號(hào),兩者對(duì)比。如果相同則直接與客戶端提供

2、的版本號(hào)相對(duì)比并返回結(jié)果;如果不同則將主程序版本號(hào)寫入數(shù)據(jù)庫(kù),然后生成新的更新文件包,直接向客戶端返回更新地址。Download.ashx的功能僅僅是將最新版本更新文件包輸出。而客戶端部分包含主程序、Update.exe以及其他附屬文件,更新時(shí)由主程序檢測(cè)并下載更新,在主程序退出時(shí),如有更新并已成功下載,則調(diào)用Update.exe完成解包及更新覆蓋工作。需注意的是:Update.exe永遠(yuǎn)不能被更新,因?yàn)樗鼰o(wú)法更新其自身,所以服務(wù)端更新時(shí)也不要將Update.exe納入更新包。下面就是來(lái)實(shí)際編寫一個(gè)自動(dòng)更新解決方案:服務(wù)器端首先建立一個(gè)Web服務(wù)項(xiàng)目,項(xiàng)目名為“自動(dòng)更新服務(wù)”:新建項(xiàng)目項(xiàng)目美型

3、(P):VisualC#WindowsWeb智能設(shè)備數(shù)據(jù)庫(kù)ReportingSilverlightWCFWorkflow蜘DotfuscatorProjects其他項(xiàng)目類型虹式項(xiàng)目模板CO:VisualStudio已安裝的模板;3ASP.NETWeb應(yīng)用程序'lASP.NETAJAX1器控件受眼努器控件潸Web我的模板.上嶷聚隈機(jī)膜板NETFramewc溪WCF質(zhì)應(yīng)用程序爭(zhēng)切態(tài)第據(jù)實(shí)體Web應(yīng)用程序用于創(chuàng)建XMLWeb1第的項(xiàng)目(,NETFramework3,5)芝建解云方案的目錄(陰名稱(N):解決方案名稱(M):UpdateTeZt,添加一數(shù)據(jù)庫(kù),名為Database.mdf:添加

4、新項(xiàng)-行而更新抿勢(shì)VisualC#WebWindowsFormsWPF常規(guī)代碼q-JJ-BExpressionBlendReportingSifverlightWorkflow一XJSQLServer臺(tái)生我的模板J搜素限機(jī)模板w空SQLServer毒笨荒名稱(N):ba在數(shù)據(jù)庫(kù)中創(chuàng)建新的數(shù)據(jù)庫(kù)關(guān)系圖,并如下設(shè)計(jì)數(shù)據(jù)庫(kù)表:創(chuàng)建一個(gè)Ado.NetEntityDataModel,名為Model.edmx:添加新項(xiàng)-自前更新服務(wù)翔KQ:VisualC#WebWindowsFormsWPF常規(guī)代碼ExpressionBlendReportingSilverlightWorkflow口號(hào)版頁(yè)iADO.NE

5、TEntityDataMode里IAJAX客戶蔬由??贏JAX母版貢HTML瓦JNQtoSQL美避WCF服務(wù)Web配置文件閨XML雌Hxslt文件II投表切程序集信息文件VisualStudio已安裝的模板J2Web窗體的Web用戶控件>3siveHight應(yīng)用程序MADONET數(shù)據(jù)服務(wù)歲AJAX客土方行為空AJAX客士律庫(kù);DynamicData字段QjScript文件JSQLServer薊Web展芳,2_Windows即本宿主國(guó)XML文件為安裝程猙報(bào)表向?qū)в糜趧?chuàng)建ADO.NET實(shí)體數(shù)據(jù)模型豹目項(xiàng).名稱(N):從剛才的建立的數(shù)據(jù)庫(kù)中生成模型:UpdateVersion.交-硝雌iSPl

6、iblkTimeVersion匕導(dǎo)航屈性在Web.Config的appSettings節(jié)點(diǎn)中新增兩個(gè)節(jié)點(diǎn),用以設(shè)置更新程序的主文件名及更新包下載地址:<appSettings><addkey="主程序文件名"value="MyApp.exe"/><addkey="更新包下載地址"value="Download.ashx"/></appSettings>引入一個(gè)GZip類用以打包(該類的源碼將在文章末尾隨本文示例源代碼一并提供):E)-L才引用GZip'OSys

7、tem添加一個(gè)新的Web服務(wù),名為Update.asmx:添1J嘀項(xiàng)-目克更新歪哥模板E:演(Q:VisualC#WebWindowsFormsWPF甯規(guī)代碼ExpressionBlendReportingSilveriightWorkflowVisualStudio已安裝的模板FWeb密球町Web用戶控件.魂Sil,出rlight應(yīng),可程序SADO.NETAJAX客戶諄行為-3JAJAX春盧屋庫(kù)彩DynamicData字酷4JJScnpt文件理Wib服豈ndovvsH囹XML文件可安笠程序奏檢報(bào)表向?qū)Q(N);用于創(chuàng)建Web服務(wù)的可視設(shè)計(jì)美書寫如下代碼:WebMethodpublicstr

8、ingGetUpdate(stringClientVerison)(if(獲取最新版本()!=ClientVerison)(更新包下returnSystem.Web.Configuration.WebConfigurationManager.AppSettings載地址"returnnull;staticstring獲取最新版本()(stringv=獲取文件(HttpContext.Current.Server.MapPath(string.Format("/App_Data/Update/0”,System.Web.Configuration.WebConfigurati

9、onManager.AppSettings"主程序文件名");using(varc=newDatabaseEntities()從數(shù)據(jù)庫(kù)取得最新版本信息varq=c.UpdateVersion.OrderByDescending(f=>f.PublicTime).FirstOrDefault();if(q=null|v!=q.Version)/數(shù)據(jù)庫(kù)中的版本與當(dāng)前主程序版本不一致時(shí),以主程序版本為準(zhǔn),寫入數(shù)據(jù)庫(kù),并生成新的更新文件包vard=newUpdateVersion()Version=v,PublicTime=DateTime.Now;c.AddToUpdate

10、Version(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(打包目錄).T

11、oArray();publicstaticstring獲取文彳生版本(string文件路徑)FileVersionInfof=FileVersionInfo.GetVersionInfo(文件路徑);returnf.FileVersion;出更新文件包代碼:publicvoidProcessRequest(HttpContextcontext)context.Response.ContentType="application/zip"context.Response.WriteFile(context.Server.MapPath("/App_Data/Updat

12、e.gzip");)服務(wù)端至此就編寫完畢了??蛻舳诵陆ㄒ粋€(gè)WinForm應(yīng)用程序項(xiàng)目,名為Update:jalC#WindowsWeb爸法設(shè)備ReportingSilverlightWCF.23Windows窗體應(yīng)程序底用程序控制臺(tái)在三程子色WPF用戶控件庫(kù)同空項(xiàng)目Workflow我的模板.jl搜素聯(lián)機(jī)槎甌,.模板CD:fuscatorProjects項(xiàng)目類型頃目墓具有'Window%臺(tái)體用=界面的應(yīng)用程序妁項(xiàng)目(.NETFrarnei.vork3,5)knirl_.rwrIr*.JJ_nn.rmr_建好之后直接刪掉Form1.cs吧,此程序不需要界面,在Program.cs

13、中寫代碼就可以了。同樣需要引入GZip類用于解包:1»i|w弓I用OSystem然后編寫代碼:STAThreadstaticvoidMain()tryvard=DateTime.Now;while(DateTime.Now.Subtract(d).TotalSeconds<10)Application.DoEvents();GZip.解壓Application.StartupPath);catch這里的作用就是等待10秒,現(xiàn)在來(lái)建立主程序,主程序是序,命名為MyAPP:曰縮(Path.Combine(Application.StartupPath,"update.da

14、ta"),然后解包update.data文件,覆蓋到當(dāng)前目錄中。WinForm、命令行、WPF都可以,我們新建一個(gè)WPF應(yīng)用程模啊IJ:visualStudio已安裝的模板rncTbWslVWPFKstffl程序VisualC#WindowsWeb智能算款據(jù)庫(kù)ReportingSilverlightWCFWorkflow陶DctfuscatorProjects其他項(xiàng)目類型目回WPF用二控件廢國(guó)史項(xiàng)目我的模板圍解聯(lián)方嗨粒.VindowsPresentationFoundation客戶1,應(yīng)用程序CNETFramework3.尸,IIIlrjJ!_為程序添加服務(wù)引用:添加服務(wù)弓I用若要查

15、看特定服務(wù)器上的可用服務(wù)列表r清接人服務(wù)URL,然后單擊“轉(zhuǎn)到“.若要泡覽可用的年擊"發(fā)現(xiàn)1t.±mt(A):http"/1(j8lhoyt:50267/Updat%3£mjt服務(wù):操做0):S®UpdateGetUpdateUpdateSoapuhttp:/localhost50267/Update.asmjc"處找到1個(gè)服轉(zhuǎn).余名空間(N):ServiceReference高裹(V)|篇定|這里的地址使用的是本地的調(diào)試地址。為了檢測(cè)主程序自身的版本號(hào),還需要添加對(duì)System.Windows.Forms的引用。然后開(kāi)始設(shè)計(jì)界面,這

16、里僅為演示更新操作,所以界面上只是簡(jiǎn)單的設(shè)計(jì)了更新相關(guān)的提示、操作控件:險(xiǎn)測(cè)到新版本.是否下龕?更纖包已下載吉畢.在理序關(guān)而后怪目前我行更新操作.TJ代碼為:<Windowx:Class="MyApp.Window1"xmlns="http:xmlns:x="http:Title="Window1"Height="300"Width="377"Loaded="Window_Loaded”Closed="Window_Closed"><Grid>

17、;<Grid.RowDefinitions><RowDefinitionHeight="1*"/><RowDefinitionHeight="1*"/><RowDefinitionHeight="1*"/></Grid.RowDefinitions><LabelMargin="0"Name="label1"HorizontalAlignment="Center"VerticalAlignment="C

18、enter"Visibility="Hidden">檢測(cè)到新版本,是否下載?</Label><ButtonGrid.Row="1"Height="23"Name="button1"VerticalAlignment="Center"Visibility="Hidden"Click="button1_Click”>開(kāi)始下載</Button><LabelGrid.Row="2"Margin=&

19、quot;0"Name="label2"VerticalAlignment="Center"HorizontalAlignment="Center"Visibility="Hidden">更新包已下載完畢,在程序關(guān)閉后將自動(dòng)執(zhí)行更新操作。</Label></Grid></Window>需注意的是,這里控件都被設(shè)置為Visibility="Hidden",我們將會(huì)在需要時(shí)再將其顯示出來(lái)。編寫后臺(tái)代碼:publicUriDownloadUriget

20、(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.

21、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.C

22、ombine(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");測(cè)試現(xiàn)在將主程序、附屬文件和Update.exe放在一起,并將主程序及附屬文件復(fù)制一份放到服務(wù)器端的App_data/Update/目錄中,再添加一個(gè)“更新說(shuō)明.txt”:isu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論