,,ClickOnce DIY全自动更新下载升级的自我实现

,,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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • axure复选框全选取消,axure带复选框的树形菜单
  • 飞利浦耳机真伪,飞利浦的耳机是哪里生产的
  • Realtek高清晰音频管理器设置指南:最佳配置分享
  • win101809怎么升级到1903,win101709怎么升级1903
  • python 爬虫 多线程,python 线程并发
  • 软件测试之python面试题,python试卷生成器
  • vue功能显示与隐藏怎么实现,vue实现忘记密码功能
  • 怎么把单元格里面的内容拆分成多行,excel一个单元格的内容拆分成多行
  • 分布式专题(分布式讲解)
  • swatch2009款式,swatch 型号怎么看
  • 手机能运行win10吗,为什么手机没有windows系统
  • cad缩略图怎么设置好用,cad怎么显示缩略图
  • python读取json文件转化为list,python将文本数据转换成表格
  • ora-12154 无法解析指定的连接标识符,oracle12154,无法解析指定的连接标识符
  • 如何理解java语言程序设计的面向对象,java面向对象程序设计和java有什么不同_1
  • 留言与评论(共有 条评论)
       
    验证码: