软件自动更新原理

  • 格式:pdf
  • 大小:117.44 KB
  • 文档页数:7
三、在.Net 时代的实现。
在.Net 时代,我们就有了更多的选择,可以使用 WebRequest,也可以使用 WebServices。在这里我们将用 WebServices 来实现软件的自动升级。
实现原理:在 WebServices 中实现一个 GetVer 的 WebMethod 方法,其作用是获取当前的最新版本。 然后将现在版本与最新版本比较,如果有新版本,则进行升级。
int count = int.Parse(updateNode.Attributes["count"].Value); //将 xml 中的 value 用实际内容替换
for(int i=0;i<count;i++)
{
XmlNode itemNode = updateNode.ChildNodes[i];
[WebMethod(Description="取得更新版本"] public string GetVer() { XmlDocument doc = new XmlDocument(); doc.Load(Server.MapPath("update.xml"); XmlElement root = doc.DocumentElement; return root.SelectSingleNode("version".InnerText; }
级文件,而用一个简单的 BAT 文件来实现升级。
Public Sub CheckUpdate() On Error Resume Next Dim b As Boolean Dim XmlHttp As Object Set XmlHttp = CreateObject("Microsoft.XMLHttp" XmlHttp.Open "GET", "/MuAdmin/update.xml", False XmlHttp.Send
If Major > App.Major Then b = True
ElseIf Minor > App.Minor Then b = True ElseIf Revision > App.Revision Then b = True Else b = False End If If (b) Then Dim result As VbMsgBoxResult result = MsgBox("发现程序新版本。当前版本为:" & App.Major & "." & App.Minor & "." & App.Revision & ",目前最新版本为:" & Version & ",是否进行更新?", vbQuestion Or vbYesNo, "自动更新" If result = vbYes Then Dim frm As New Update frm.DownloadAddress = downAddr frm.size = FSize Page = fInfo frm.Version = Version frm.Show vbModal End If End If End Sub
一、升级的好处。 长期以来,广大程序员为到底是使用 Client/Server,还是使用 Browser/Server 结构争论不休,在这些争论 当中,C/S 结构的程序的可维护性差,布置困难,升级不方便,维护成本高就是一个相当重要的因素,也是 那些 B/S 的支持者们将 Client/Server 结构打入地狱的一个重要原因。
3、WebServices 的 GetUpdateData 方法。 [WebMethod(Description="在线更新软件"]
[SoapHeader("Xml.XmlDocument GetUpdateData()
{ //验证用户是否登陆
if(sHeader==null)
步骤: 1、准备一个XML文件 (Update.xml)。 <?xml version="1.0" encoding="utf-8" ?> <product> <version>1.0.1818.42821</version> <description>修正一些 Bug</description> <filelist count="4" sourcepath="./update/"> <item name="City.xml" size=""> <value /> </item> <item name="CustomerApplication.exe" size=""> <value /> </item> <item name="Interop.SHDocVw.dll" size=""> <value /> </item> <item name="Citys.xml" size=""> <value /> </item> </filelist> </product> 作用是作为一个升级用的模板。 2、WebServices 的 GetVer 方法。
doc.Load(Server.MapPath("update.xml");
XmlElement root = doc.DocumentElement; //看看有几个文件需要更新
XmlNode updateNode = root.SelectSingleNode("filelist";
string path = updateNode.Attributes["sourcepath"].Value;
如果更新的是主程序,那么就必须关闭主程序了。可是主程序关闭了之后,谁来调用安装补丁呢?为 了解决这个问题,人们把主程序和自动更新程序分开来做。当需要校验版本的时候,主程序调用自动更新 程序。自动更新程序如果发现主程序需要更新,在下载了升级补丁之后,就会要求关闭主程序。主程序关 闭之后,自动更新程序调用升级补丁进行安装,安装完成后再重新启动主程序。自动更新程序自动退出, 完成更新任务。这和你刚才关闭电脑后再插网卡的原理是一模一样的。其实生活中有很多现象可以借鉴到 软件设计中。
Dim vs As String vs = XmlHttp.responseText If Err.Number > 0 Then Exit Sub End If
Dim Xml As Object Set Xml = CreateObject("Microsoft.XmlDom" Xml.LoadXml vs Dim Version As String Dim downAddr As String Dim FSize As Long Dim fInfo As String Version = Xml.DocumentElement.ChildNodes(0).Text downAddr = Xml.DocumentElement.ChildNodes(1).Text FSize = CLng(Xml.DocumentElement.ChildNodes(2).Text) fInfo = Xml.DocumentElement.ChildNodes(3).Text Set Xml = Nothing Set XmlHttp = Nothing
软件更新原理 自动更新的时候,客户端软件提交更新请求给固定的网址,然后网址返回最新版本的版本号。客户端 软件和自己的版本号对比,如果发现服务器的版本和自己的版本不一样,那么就请求下载升级补丁。服务 器响应请求,提供补丁下载;下载成功后,手动或自动安装一下就可以了。
安装补丁的时候,客户端的主程序一般是要关闭的,除非采用动态卸载、调入组件的技术,比如网络 游戏,就是尽量让玩家边玩游戏边更新。
Dim Major As Long Dim Minor As Long Dim Revision As Long Dim C() As String C = Split(Version, "." Major = CLng(C(0)) Minor = CLng(C(1)) Revision = CLng(C(2))
BinaryReader br = new BinaryReader(fs); //这里是文件的实际内容,使用了 Base64String 编码
itemNode.SelectSingleNode("value".InnerText
=
Convert.ToBase64String(br.ReadBytes((int)fs.Length),0,(int)fs.Length);
人们嫌这样的升级仍然太麻烦,后来出现了 B/S 结构,大家像抓住了救命稻草一样的追捧至今,希望 能从这些劳动中解脱出来。B/S 结构就是浏览器/服务器结构,它所有的功能,都是在浏览器里完成。程序 升级的时候,只需要在服务端升级一下就可以了,浏览器再次访问服务器的时候,得到的就是新版本。你 可以把它理解成一个纯粹的网站。是不是站长更新的时候,你打开网站就看到最新的页面?
return null;
if(!DataProvider.GetInstance.CheckLogin(ername,sHeader.Password))
return null; //取得更新的 xml 模板内容