,,ClickOnce DIY全自动更新下载升级的自我实现
智能客户端概念近来比较热,但在微软提出这个名词以前已经有大量的软件在这么做了,一方面是简化客户端的部署,一方面是提供自动升级的功能;对于传统的WinForm应用来讲,确实是可以降低维护成本的一个不错的解决方案;微软在推出智能客户端概念时,推出了相关的更新器的应用程序块,做的也蛮不错,但作者前段还是根据软件特性自己写了一个很简单的实现,大家也大概能了解一下原理:笔者的简化版自动升级管理器只需要四步走: 1.一个负责查找和下载新版本的本地类2.本地配置文件中(或在代码中硬编码?不太好吧),指向更新服务器的网址3。服务器上一个标识版本号和新文件统一资源定位器的配置文件4.调用示例1.版本管理类使用系统;使用系统。集合。泛型;使用系统。文本;使用系统XmlusingSystem。网;使用系统。木卫一;使用系统窗户。forms namespace survey { classVersionAgent { publistaticboolchecknetwork(){ http webrequest request;请尝试{ request=(http WebRequest)WebRequest .创建(酒吧.获取设置(“更新URL”);//从本地配置文件获取的网络中配置文件的统一资源定位器请求Proxy=WebProxy .GetDefaultProxy();请求GetResponse();//如果可以获得响应,说明网络没问题} catch(例外一){ pub。对数误差(e);返回假的;} returntrue}
publistaticboolcheckupdate(){ XML document doc=load XML document(Pub .获取设置(“更新URL”);系统.UpdateUrl=GetValue(doc,' DownloadURL ').trim();//将来会用这个统一资源定位器自动下载系统.UpdatePage=GetValue(doc,' DownloadPage ').trim();//如自动下载失败,会提供到这个页面手工下载stringwarningRate=GetValue(doc,' warningRate ').trim();漂浮TryParse(warningRate,outSys .警告忘恩负义者);stringNetVersion=GetValue(doc,' Version ').trim();VersionLocalVersion=System .反思。组装。getexecutionassembly().GetName().版本;returnnewVersion(网络版).比较(新版本(本地版本))0;//大于0说明有新版本发布}//这个方法是载入网络配置文件,读取一些不想放在本地的配置参数,以及比较本地和网络版本号publistaticboolgoupdate(){ returnDownLoadFile(Sys .更新文件,系统.更新网址);
} publistaticstringgetvalue(XML文档doc,string key){ string value;请尝试{ XML element elem=(XML element)doc .SelectSingleNode(@ '/config/app/' Key);//读取配置文件可自行定义Value=elem==null?elem .get属性(" value ");} catch { Value=} return Value } publistaticxmldocumentloadxml文档(stringfilenamerorurl){ XML文档doc=null请尝试{ doc=新XML文档();医生load(文件名or URL);} catch(例外一){ System .窗户。表格。messagebox。显示(e . Message);出版对数误差(e);doc=null} returndoc}
publistaticbooldownloadfile(字符串文件名,字符串URL){ boolValue=false;webresponse response=nullStreamstream=null请尝试{ http WebRequest request=(http WebRequest)WebRequest .创建(网址);回应=请求GetResponse();流=响应GetResponseStream();如果(!回应ToLower().开头为(' text/'){ Value=SaveBinaryFile(response,FileName);} } catch(异常一){//System .窗户。表格。messagebox。显示(e . Message);出版对数误差(e);} returnValue}
privatestaticboolSaveBinaryFile(webresponse响应,字符串文件名){ boolValue=truebyte[]buffer=新字节[1024];尝试{ if(File .存在(文件名))文件。删除(文件名);StreamoutStream=System .IO。文件.创建(文件名);StreaminStream=响应GetResponseStream();intldo { l=inStream .读取(缓冲区,0,缓冲区.长度);如果(l0)流出Write(buffer,0,l);} while(l0);外流. close();流内. close();} catch(例外一){ System .窗户。表格。messagebox。显示(e . Message);出版对数误差(e);值=假;} returnValue} } } 2。本地配置文件可能如:配置appSettings addkey=' update URL ' value=' http://www。ABC。com/下载/发布。XML“//appSettings/configuration 3 .网络配置文件可能如:配置应用程序版本值=' 1。1 .9 .2 '/发布日期值=' 2006-12-12 '/下载页面值=' http://www。ABC。com/download/index。htm '/下载URL value=' http://www。ABC。com/下载/更新。exe '/警告率值=' 0.3 '/app/config 4。调用示例在认为合适的时机(比如说应用程序启动时),启动一个后台线程去工作:thread thread=new thread(new threadstart(线程方法更新));线程. start();
privatewightreadmethoddupdate(){
if(版本代理.CheckNetwork())//网络状况正常{ if(VersionAgent .CheckUpdate())//检查更新并获取网络参数{ if(VersionAgent .GoUpdate())//获取新版本(由于我的软件很小,所以在不提示用户的情况就进行了新版下载,如认为不妥,可通过MessageBox提示一下){ MessageBox .显示('检测到产品的更新版本,即将开始自动更新!','版本升级消息框按钮.好了MessageBoxIcon .信息);系统。诊断。处理。启动(系统.更新文件);系统。环境。退出(0);} else { MessageBox .显示('系统检测到更新版本,但自动下载失败,点击确定进行手动下载','版本升级消息框按钮.好了MessageBoxIcon .错误);系统。诊断。处理。启动(系统.更新页面);系统。环境。退出(0);} } } else//也可以什么也不提示消息框.显示('无法连接到服务器进行自动升级!\n请检查网络连接出版GetSetting('UpdateUrl '),'网络异常消息框按钮.好了MessageBoxIcon .警告);}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。