CS程序自动更新实现原理及代码(支持多版本多文件更新)
公司主要项目为CS端,经常遇到客户需求变更及bug处理,在没有引用自动更新之前每次更新程序,必须手动对每个客户端进行更新,这样导致技术支持工作量特别大,也给客户不好的印象,因此我需要一个自动更新程序!
我们实现自动更新大概有这2种实现方式:
一、通过TCP网络通讯的方式,客户端程序监听,当服务端有更新文件的时候,自动比对本地版本,如果服务器版本大于本地版本就可以更新,这种实时性好,不需要等到客户第二次重启的时候才发现有版本更新
二、在服务端部署文件更新服务器,通过Web访问。同样是当服务端有更新文件的时候,平台第二次打开自动比对本地版本,如果服务器版本大于本地版本就可以更新,这种需要客户在第二次运行平台的时候才有效(可能有同学说可以在客户端实时下载读取服务端文件进行对比,但一般不这样做)
我们下面主要讲第二种实现方式:
自动更新实现原理:运行客户端先启动自动更新程序,程序会先通过升级文件所在服务器端的网址下载服务器上面的UpdateList.xml到本来临时文件夹,再与本地UpdateList.xml内容进行版本比较,当服务器版本上有文件大于本地版本的时候,就把对应文件下载下来进行覆盖更新工作(如果是压缩文件新进行解压);自动更新完成后启动客户端程序关闭自动更新程序;
自动更新实现准备工作: 1.发布一个web自动更新文件站点,里面包括需要更新的文件及UpdateList.xml(描述更新文件列表、版本、时间、更新文件服务器所在地址等);
<?xml version="1.0" encoding="utf-8" ?>
<AutoUpdate>
<!--升级文件所在服务器端的网址-->
<URLAddress URL="http://127.0.0.1/SecWS/update"/>
<Application>
<!--主程序入口-->
<EntryPoint ApplicationID="SFBR_ABDoorMangerSystem.exe"/>
<Location ip="127.0.0.1"/>
<Version Num="1.0.0.0"/>
</Application>
<UpdateInfo>
<!--升级文件的更新日期-->
<UpdateTime Date= "2017-01-22 12:00"/>
<!--升级文件的版本号(每次更新必须升级版本)-->
<Version Num= "9.0.0.0"/>
</UpdateInfo>
<UpdateFileList>
<!--升级文件列表-->
<UpdateFile Ver="1.0.0.0" FileName= "updateAB.rar" ContentLength="21k"/>
</UpdateFileList>
</AutoUpdate>
2.因有时一次更新文件比较大,需要能对文件进行压缩后,通过自动更新程序下载到本地再解压(支持压缩解压及单个文件更新)
3.自动更新程序需要需要实现这个InterfaceAutoUpdateMng接口,客户端通过这个反射调用该接口是否有更新
/// <summary>
/// 自动更新接口
/// </summary>
public interface InterfaceAutoUpdateMng
{
/// <summary>
/// 判断是否有更新
/// </summary>
/// <returns></returns>
bool IsUpdate();
}
public class AUpdateMng : InterfaceAutoUpdateMng
{
#region 属性
private FrmUpdate frmU;
#endregion public AUpdateMng()
{ } #region 方法
/// <summary>
/// 判断是否有更新
/// </summary>
/// <returns></returns>
public bool IsUpdate()
{
if (frmU == null)
{
frmU = new FrmUpdate();
frmU.Name = "frmU";
} return frmU.IsUpdate;
}
#endregion
}
4.客户端运行之前先检查是否更新,所以必须在客户运行之前启动自动更新程序检查是否有更新,如下代码:
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); AppDomain.CurrentDomain.UnhandledException += delegate
{
cGlobe_Log.Error(cGlobe_Log.GetMethodInfo() + "异常退出");
};
try
{
InterfaceAutoUpdateMng autoupdate = null;
bool bl;
string strPath = Application.StartupPath + "\\AutoUpdate.exe";
if (System.IO.File.Exists(strPath))
{
autoupdate = System.Reflection.Assembly.LoadFrom(strPath).CreateInstance("AutoUpdate.AUpdateMng") as InterfaceAutoUpdateMng;
}
else
{
autoupdate = null;
} if (autoupdate == null)
bl = false;
else
bl = autoupdate.IsUpdate();
if (bl)
{
System.Diagnostics.Process.Start(strPath);
}
else
{
bool bCreatedNew; System.Threading.Mutex m = new System.Threading.Mutex(false, "TestAutoUpdater", out bCreatedNew); if (bCreatedNew)
Application.Run(new Form1());
else
{
MessageBox.Show("平台已开启!");
}
}
}
catch (Exception ex)
{ cGlobe_Log.Error(cGlobe_Log.GetMethodInfo() + ex.Message);
} }
}
5.自动更新界面如下;

自动更新源码地址:链接:https://pan.baidu.com/s/1WR7eivGNtVsLMP9KeRBd_g 提取码:9cmq
CS程序自动更新实现原理及代码(支持多版本多文件更新)的更多相关文章
- EF-使用迁移技术让程序自动更新数据库表结构
承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与 ...
- [搜片神器]winform程序自己如何更新自己的方法代码
DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr 国外测试 ...
- PHP网站安装程序的原理及代码
原文:PHP网站安装程序的原理及代码 原理: 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安 ...
- nw.js桌面程序自动更新(node.js表白记)
Hello Google Node.js 一个基于Google V8 的JavaScript引擎. 一个伟大的端至端语言,或许我对你的热爱源自于web这门极富情感的技术吧! 注: 光阴似水,人生若梦, ...
- .Net桌面程序自动更新NAppUpdate
自动更新介绍 我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.应用程序自动更新是由客户端应用程序自身负责从一个已知服务器下载并安装更新,用户唯一需要进行干预的是决定是否愿意现在或以后 ...
- Windows 程序自动更新方案: Squirrel.Windows
Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...
- iOS程序自动检测更新的实现
本文转载至 http://blog.csdn.net/davidsph/article/details/8931718 App Store自动更新itunes 之前项目需要用到app自动更 ...
- 【转】iOS程序自动检测更新的实现 -- 思路不错
原文网址:http://blog.csdn.net/davidsph/article/details/8931718 之前项目需要用到app自动更新的功能,现将实现方案分享出来.iOS程序自动提示更新 ...
- aspx.designer.cs没有自动生成代码(没有自动注册)
遇到这个问题的最大可能是:aspx页面存在bug. 比如说我的主页是从项目里的别的页面复制过来的,但是少复制了一些引用,页面就存在bug,导致aspx.designer.cs没有自动生成代码. 解决方 ...
随机推荐
- Vue全家桶(Vue-cli、Vue-route、vuex)
摘要 学习本篇之前要具备一定的vue基础知识,可以先看一下Vue基础(环境配置.内部指令.全局API.选项.内置组件) 1.Vue-cli Vue-cli是vue官方出品的快速构建单页应用的脚手架,这 ...
- 从PRISM开始学WPF(番外)共享上下文 RegionContext-更新至Prism7.1
RegionContext共享上下文 There are a lot of scenarios where you might want to share contextual information ...
- MySQL高可用复制管理工具 —— Orchestrator使用
背景 在上一篇「MySQL高可用复制管理工具 —— Orchestrator介绍」中大致介绍了Orchestrator的功能.配置和部署,当然最详细的说明可以查阅官方文档.本文开始对Orchestra ...
- asp.net mvc前台显示带htm标签的解决办法(Razor —@Html.Raw())
数据是从后台富文本编辑后丢在数据库后取出的,不加Html.Raw(),前台就会把Html标签一同显示
- Netty解决粘包和拆包问题的四种方案
在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...
- Excel的读取和保存(POI)
示例 Excel文件: 数据读取: 保存路径: Jar包准备 下载地址: 链接:https://pan.baidu.com/s/1RZAwEsFwjKMlnYYGwHMfaA 提取码:h9mj 文件上 ...
- Java设计模式---Strategy策略模式
参考于 : 大话设计模式 马士兵设计模式视频 1.场景介绍 购物网站上有一个产品,有三个字段,档次,价格,重量. 有些同学喜欢轻的,有些手头紧,想要便宜的,有些喜欢档次高的. 那么我们为了提高网站用户 ...
- Java工具类——通过配置XML验证Map
Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...
- PHP制作个人博客-广告位添加与调用 推荐文章数据调取
上一节博客的导航我们已经动态调取,这一节我们主讲一下如何根据页面布局,后台添加广告位,及模板上动态调取广告.博客推荐文章的数据调用. 首先我们在云码博客的后台添加10条左右的测试数据,thinkcmf ...
- Kail Linux的安装方法
众所周知,kail 是一个基于Debian的Linux发行版,它的目标就是为了在一个实用的工具包里尽可能多的包含渗透和审计工具 kail就实现了这个目标,里面包含有很多关于安全测试的开源工具,如果现在 ...