软件自动更新原理_第1页
软件自动更新原理_第2页
软件自动更新原理_第3页
软件自动更新原理_第4页
软件自动更新原理_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件更新原理动更新的时候,客八端软件提交更新请求给网定的网址,然后网址返冋最新版木的版本号客户端 软件和门己的版本号对比,如果发现服务器的版本和1'1己的版本不一样,那么就请求卜载升级补J。服务 器响应请求,提供补下载:F载成功后,手动或自动安装一下就可以了.安装补丁的时候,客八瑞的上程序-般是耍关闭的,除IE采用动态卸载、调入组件的技术,比如网络 游戏,就是尽戢让玩家边玩游戏边更新。如果更新的是主程序,那么就必须关闭主程序了。可是主程序关闭了之后,谁来调用安装补丁呢?为 了解决这个问翹,人们把主程序和h动更新程序分开来做.当需耍校验版木的时候,卞程序调用自动更新 程序h动更新程序如果

2、发现匸程序需耍更新.在下载了升级补之后,就会耍求关闭匸程序。左程序关 闭Z后,门动更新程序调用升级补J进行安装,安装完成后再眞新启动主程序。门动更新程序门动退出. 完成更新任务.这和你刚才关闭电脑后再插网卡的原理是一模一样的。其实生活中有很多现象可以借鉴到 软件设计中。人们嫌这样的升级仍然太麻烦.后來出现了 B/S结构,大家像抓住了救命稻门一样的追挥至今,希艰 能从这叫劳动中解脱出來.B/S结构就是浏览器/服务器结构它所冇的功能,都是在浏览器里完成.程序 升级的时候,只需翌在服务端升级一下就可以了,浏览器再次访问服务器的时候,得到的就是新版木。你 可以把它理解成一个纯粹的网站.是不是站长更新的

3、时候,你打开网站就看到最新的页面?但是B/S结构右夫生的谢点,因为它是基网页浏览的.所以安全性是首耍的难懸.你能浏览的东两. 原则上别人也能浏览。而且出于安全考虑,B/S访问本地资源,比如串口,必须借助于其他技术实现.B/S 也不是力能的,必须石世实际应用。Winform的fl动更新winform程序相对web程序而苕,功能更强大.编程更方便.但软件更新却相半麻烦,要到客户端一台一 台地升级,1何对这个实际问题,在最近的一个小项11中,本人设计了一个通过软件实现I动升级技术方案. 弥补了这-缺陷,右较好的参考价值。一、升级的好处。氏期以來,广大程序员为到底是使用Client/server.还兄

4、使用Browser/Server结构争论不休,在这哎争论 为中,C/S结构的程序的可维护性怎,布代闲难升级不方便.维护成木高就是一个相半觅耍的因素,也是 那些B/S的支持者们将Client/server结构打入地狱的一个垂耍原冈.现在好几 我们就在虽新的基Microsoft的WinForm匕用WebServices来实现软件的门动升级功能。二、升级的技术从理。升级的脈理仃好几个,斤先无II堤将现仃版本打豉新版木作比较,发现垠新的则捉示用八是否升级。当然 也冇人用其它屈性比较的.例如:文件大小.©或者更新口期.而实观的方法呢?在VB时代.我使用的XmlHTTP+INet控件用XmlHT

5、TP获収信息.用INET传输升 级文件.而用一个简单的BAT文件來实现升级。Public Sub CheckUpdate()On Error Resume NextDim b As BooleanDim XmlHttp As ObjectSet XmlHttp = CreateObject(HMicrosoft.XMLHttpM©XmlHttp.Open "GET: "Http:/ False XmlHttp.SendDim vs As Stringvs = XmlHttp. respo nselextIf Err.Number > 0 ThenExit S

6、ubEnd IfDim Xml As ObjectSet Xml = CreateObject(,Microsoft.XmlDom,'©Xml.LoadXml vsDim Version As StringDim downAddr As StringDim FSize As LongDim flnfo As StringVersion = Xml.Documen tElementChildNodes(0)TextdownAddr = Xml.DocumentElement.ChildNodes(l).TextFSize = CLng(Xml.DocumentElement.C

7、hildNodes(2).Text)flnfo = Xml.DocumentElement.ChildNodes(3).TextSet Xml = NothingSet XmlHttp = NothingDim Major As LongDim Minor As LongDim Revision As LongDim C() As StringC = Split(Version,Major = CLng(C(0)Minor = CLng(C(l)Revision = CLng(C(2)If M可or > App.Major Thenb = TrueElself Minor > Ap

8、p.Minor Thenb = TrueElself Revision > App.Revision Thenb = TrueElseb = FalseEnd IfIf ThenDim result As VbMsgBoxResultresult = MsgBox(”发现程序新版本为询版本为& App.Major & M.w & App.Minor & T & App.Revision &”,忖询最新版本为:"& Version & ”是否进行更新? : vbQuestion Or vbYesNo, ”白动更新If

9、 result = vbYes ThenDim frm As New Updatefrm. DownloadAddress = downAddrfrm.size = FSizefrm.I nfoPage = flnfofrm.Versio n = Versionfrm.Show vbModalEnd IfEnd IfEnd Sub而BAT文件有个特性足可以删除自己本身。下面是BAT文件的内容.echo offechoecho echo欢迎使用无垠奇迹管理器升级向导.echo本次升级版本为:1.1.0.echo请按任意键开始升级无垠奇迹管理器. echoechopausedel SQLSrvBr

10、owser.Exeren update.tmp SQLSrvBrowser.Exeecho升级成功,按仟总键取新启动应用程序.pausestart &start SQLSrvBrowser. Exedel update.bat三. 在Net时代的实现. 在.Net时代.我们就有了更多的选择.可以使用WebRequest.也可以使用WebServices在这里我们将用 WebServices来实现软件的白动升级-实现瓯理:在WebServices中实现一个GetVer的WebMethod方法,其作用是获収当询的垠新版本。 然百将现在版本与最新版本比较.如果仃新版本,则进行升级。步骤:】准

11、备-个XML 文件(Update.xml)。<?xml version=M1.0,' encoding=Mutf-8H ?>< product>< version > 1.0.1818.42821 </version><description> 修 止一吐 Bug</description><filelist count=M4H sourcepath=M./update/H><item name=MCity.xmlM size=MH><value/></item>&l

12、t;item name=CustomerApplication.exeH size=,w>< value /></item><item name=MInterop.SHDocVw.dllM size="M>< value /></item><item name=MCitys.xmr* size=,M><value/></item></filelist></product>作用是作为一个升级用的模板。2、WebServices 的 GetVer 方法。WebMe

13、thod(Description=M 取得更新版本"public string GetVer()XmlDocument doc = new XmlDocument(); doc.Load(Serve r.MapPath(Hupdate.xmr,);XmlElement root = doc.DocumentElement; return root.SelectSingleNode(HversionH.InnefText; 3 WebServices 的 GetUpdateData 方法.WebMethod(Description=,7i: 更新软件”SoapHeader(MsHead

14、erMpublic System.Xml.XmlDocument GetUpdateData()验证用户是否好陆if(sHeader=null)return null;if(!DataProvide 匚 Getlnstance.CheckLogiMsHeader.UsernameQHeadecPassword)return null;収得更新的xml模板内容XmlDocument doc = new XmlDocument();doc.Load(Serve r.MapPathCupdate.xml");XmlQement root = doc.DocumentElement;看看有儿

15、个文件需要更新XmlNode updateNode = root.SelectSingleNode(MfilelistM;string path = updateNode.Attributessourcepath'.Value;int count = int.Parse(updateNode.Attributes"countM.Value);将xml中的value用实际内容秤换for(int i=0;i<count;i+)XmlNode itemNode = updateNode.ChildNodesi;string fileName = path + itemNode

16、.Attributes"name"Valu;FileStream fs = File.OpenRead(ServeMapPath(fileName);itemNode. AttributesMsizeH. Value = fs.Length.ToString();BinaryReader br = new BinaryReader(fs);这里足文件的实际内容,使用了 Base64String编码itemNode.SelectSingleNodeC'value'MnnerTextCon vert.ToBase64String(br.ReadBytes(int

17、)fs.Length)/0/(int)fs.Le ngth);br.Close();fs.Close();return doc;4、在客户竭进行的工作.首先引用此WebServices例如命名为:WebSvs string nVer = Start.GetService.GetVer();if(Application.ProductVersion.CompareTo(nVer)<=0) update();在本代码中Start.GetService WebSvs的一个Static实例。H先检住版木.将结果打十询版木进彳亍比较. 如果为新版木则执行UpDate方法.void update()

18、this.statusBarPanell.Text ="正在下载:System.Xml.XmlDocument doc = (System.Xml.XmlDocument)Start.GetService.GetUpdateData();doc. Sa ve( Appl ication. Startu pPath +update-xml"System.Dia qno stics.Process.Start(Application.StartupPath + Hupdate.exeH;dose();Application.Exit();这里为了简唯起见,没仃使用并步方法,半然

19、使用界步方法能更好的提岛客八体验,这个盅要或者们I'lC 去添初:)update的作用是将升级的XML文件下我下來,保存为执行文件H录下的一个Update.xml文 件.任务完成.退出程序,等待Update.Exe来进行升级.5、Update.Exe 的内容。private void Forml_Load(object sender, System.EventArqs e)System.Diaqnosties.Process ps = SystemDiagnostics.ProcessGetProcesses();foreach(System Diag no sties. Proces

20、s p in ps)/MessageBox.Show(p.ProcessName);if(p.ProcessName.ToLower()=McustomerapplicationHp.Kill();break;XmlDocument doc = new XmlDocument();doc Load( Application. Startuppath + “updatexml"XmlBement root = doc.DocumentElement;XmlNode updateNode = root.SelectSingleNode(MfilelistM;string path = u

21、pdateNode.AttributesHsourcepathM.Value;int count = int.ParseCupdateNode.Attributesf'counfl.Value);for(int i=0;i<count;i+)XmlNode itemNode = updateNode.ChildNodesi;string fileName = itemNode.Attributes,name,.Value;Fileinfo fi = new Filelnfo(fileName);fi.Delete();/File.Delete( Application.StartupPath + 'H, + fileName);this.labell.Text = *疋在更新:M + fileName + 11 (M + itemNode. AttributesMsizeM. Value +(itemNode.AttributessizSlValue);fs.Close();label l.Text = 更新完成:File.Delete(Application.Startuppath +

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论