当前位置: 首页 > news >正文

.NET实现之(自动更新)

做开发的人,尤其是做客户端(C/S)系统开发的人都会遇到一个头疼的问题,就是软件的 自动更新;系统发布后怎样自动的更新程序,在下有幸开发过一个自动更新程序,更新程序与任何宿主程序是完全独立的;只要在主程序里面启动更新程序就行了; 更新程序也是一个可执行文件,在启动的时候可以设置是否是自动更新和是否是手动更新,自动更新的意思就是说不需要人工的干预实现从远程服务器下载更新包, 而如果是手动更新就会涉及到用户点击程序中的按钮实现更新;在自动更新与手动更新中可以根据项目的需要进行选择,有的程序必须要求用户进行更新才能继续使 用,所以程序自动更新是有必要的;手动更新就是用户可以随时更新程序,不需要严格的控制版本问题;下面本人就来讲一下具体的实现细节,我贴出部分代码,源 码属公司财产本人不宜上传;

自动更新的目的就是将服务器上的DLL文件拷贝到本地执行目录中,并且覆盖本地同名的文件;流程很简单,但是实现起来有几个地方需要注意:

1.大批量的DLL文件怎么下载到本地来,有多个DLL文件在下载过程中如果网速慢的情况下可能出现丢包、丢文件等情况;本人的实现是将多个文件通 过ICSharpCode.SharpZipLib组件进行打包,这样可以省很多事;(如:动态连接库文件dll的名称在传输过程中大小写可能会变化)

2.下载到本地了,怎么覆盖原有的同名文件;本人的实现是先同名的文件的支持删除,然后解压缩;这个过程需要临时保存删除的文件,防止操作失败程序无法启动,要注意有事务性的原理;

3.如果更新的文件不只是单单的DLL文件可能还有一些无限极的文件夹;本人的实现是如果存在同名的文件夹,直接递归的删除,然后将其解压缩到目录中;由于压缩包解压后的顶级目录是压缩文件的名称,所有在复制的过程中需要注意目录的层次关系;

下面我们来走一下实现的整个流程,虽然没有给出整个源码,但是如果看完这篇文章的你基本实现起来没什么大问题了;

为了部署方便我建议大家麻烦点实现一个部署文件的工具,将所有的文件直接打包在里面同时生成服务器端的版本信息文件;

利用这个工具就很方便的实现了对文件进行压缩、生成HASH值、版本文件、更新地址等信息;

这个XML中保存的是服务当前的版本信息、更新文件的名称、更新文件的HASH值,为什么需要HASH就是怕更新文件在某些情况下被人调包了,如果所有的客户端更新后后果很严重;所以我们必须带上HASH值;

工具生成两个文件,一个是版本文件一个是更新包,服务器的任务已经完成,下面就是具体的客户端的实现;

为了知道何时需要进行版本更新所以要在客户端程序目录中保存一份用来记录版本信息的文件;

文件中保存着当前本地的版本号、服务器的更新地址、宿主程序的名称,需要宿主的名称就能在更新的时候将宿主程序重进程中枚举出来然后关掉,这样就不 影响我们更新了,当然也可以实现宿主程序不关闭的情况下更新,如果用到某些已经被宿主程序占用的情况会直接影响更新流程,所以以防万一关了为妙;

这是客户端版本文件中保存的信息;

我们上面说了,更新分为手动和自动,我们先来说手动更新吧,手动更新就是需要用户自己去点击更新按钮然后开始更新,这个问题我们可以利用进程的参数传递解决;

当然在更新程序里面需要有这方面的逻辑判断;

入口的地方我们进行判断,更新方式;这里的下载远程更新包是用WebClient对象,也可以用其他的基于Socket的对象;更新开始之前需要先判断本地的版本号是否小于远程版本号,如果小于在进行更新;

因为下载的过程是异步的所以需要用到后台线程建议大家使用System.ComponentModel.BackgroundWorker这个后台线程对象,他对Thread进行了很好的封装;下面来看一下核心的流程代码:

这部分代码是串联整个过程的代码;

自动更新大概就讲完了,几个关键的地方都给出了,希望对大家开发自动更新程序有帮助;

 

转:王清培

http://www.cnblogs.com/wangiqngpei557/archive/2011/05/13/2045434.html



本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2012/05/07/2486854.html,如需转载请自行联系原作者

相关文章:

  • 11.07 存取“未来”行
  • storm命令集
  • 问题解决02Linux虚拟机使用git push报错--解决方案如下:
  • CA的搭建与申请
  • 开发者亲述:个人Chrome插件被黑之后,我的应急过程全记录
  • 根据先序和中序构造二叉树
  • 重磅发布背后:POLARDB的中国故事
  • iOS开发视频教程下载/iphone开发视频教程下载
  • 王者荣耀是怎样炼成的(二)《王者荣耀》unity安装及使用的小白零基础入门...
  • Mesos将使用统一的容器管理器支持多种容器类型
  • 程序员强子
  • “The Stupidity Paradox”作者访谈
  • Linux 下安装Redis 3.0.0
  • 关于C#中的动态数组ArrayList
  • MyBatis全局配置文件MyBatis-config.xml代码
  • ES6指北【2】—— 箭头函数
  • #Java异常处理
  • AngularJS指令开发(1)——参数详解
  • Django 博客开发教程 8 - 博客文章详情页
  • Effective Java 笔记(一)
  • express.js的介绍及使用
  • in typeof instanceof ===这些运算符有什么作用
  • Java知识点总结(JavaIO-打印流)
  • MySQL几个简单SQL的优化
  • NSTimer学习笔记
  • Sass 快速入门教程
  • SpringCloud集成分布式事务LCN (一)
  • Vue组件定义
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于Android乐音识别(2)
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 三栏布局总结
  • 首页查询功能的一次实现过程
  • 数组大概知多少
  • 探索 JS 中的模块化
  • 原生 js 实现移动端 Touch 滑动反弹
  • C# - 为值类型重定义相等性
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​520就是要宠粉,你的心头书我买单
  • ​用户画像从0到100的构建思路
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (C语言)fread与fwrite详解
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)计算机毕业设计高校学生选课系统
  • (九)c52学习之旅-定时器
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)setTimeout 和 setInterval 的区别
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Core中Emit的使用
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)