公司主要项目为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程序自动更新实现原理及代码(支持多版本多文件更新)的更多相关文章

  1. EF-使用迁移技术让程序自动更新数据库表结构

    承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与 ...

  2. [搜片神器]winform程序自己如何更新自己的方法代码

    DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr 国外测试 ...

  3. PHP网站安装程序的原理及代码

    原文:PHP网站安装程序的原理及代码 原理: 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安 ...

  4. nw.js桌面程序自动更新(node.js表白记)

    Hello Google Node.js 一个基于Google V8 的JavaScript引擎. 一个伟大的端至端语言,或许我对你的热爱源自于web这门极富情感的技术吧! 注: 光阴似水,人生若梦, ...

  5. .Net桌面程序自动更新NAppUpdate

    自动更新介绍 我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.应用程序自动更新是由客户端应用程序自身负责从一个已知服务器下载并安装更新,用户唯一需要进行干预的是决定是否愿意现在或以后 ...

  6. Windows 程序自动更新方案: Squirrel.Windows

    Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...

  7. iOS程序自动检测更新的实现

      本文转载至 http://blog.csdn.net/davidsph/article/details/8931718 App Store自动更新itunes     之前项目需要用到app自动更 ...

  8. 【转】iOS程序自动检测更新的实现 -- 思路不错

    原文网址:http://blog.csdn.net/davidsph/article/details/8931718 之前项目需要用到app自动更新的功能,现将实现方案分享出来.iOS程序自动提示更新 ...

  9. aspx.designer.cs没有自动生成代码(没有自动注册)

    遇到这个问题的最大可能是:aspx页面存在bug. 比如说我的主页是从项目里的别的页面复制过来的,但是少复制了一些引用,页面就存在bug,导致aspx.designer.cs没有自动生成代码. 解决方 ...

随机推荐

  1. Python:fake-useragent 伪装请求头

    写爬虫的时候,在进行 request 请求的时候,多数情况下需要添加请求头,否则就不能正常请求. 添加请求头最常用的做法是修改 User-Agent 来伪装浏览器. 以前在写请求头的时候,都是通过 c ...

  2. 【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式

    刚开始学习设计模式之前,我是没想说要学习设计模式的,我只是因为想学习JS中的原型prototype知识,一开始我想JS中为什么要存在原型这个东西?于是慢慢通过原型而接触到设计模式,后来发现我这个过程是 ...

  3. OpenCV+TensorFlow实现自定义手写图像识别

    完整版请点击链接:https://mp.weixin.qq.com/s/5gHXGmLbtO7m3dOFrDUiHQ    或微信关注“大数据技术宅” 继用TensorFlow教你做手写字识别(准确率 ...

  4. Lumen框架—升级改造之路-开篇

    一.前言    首先,我先阐述下,为什么要做这件事.lumen是一款比较轻型的PHP框架,但是,作为项目开发来说,它还是缺少很多东西,比如Response返回值规范的自定义,异常抛出格式的自定义,以及 ...

  5. MySQL 笔记整理(18) --为什么这些SQL语句逻辑相同,性能却差异巨大?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 18) --为什么这些SQL语句逻辑相同,性能却差异巨大? 本篇我们以三 ...

  6. C# 委托还能这样用

    一直找不到一种能够让很多对象都能在几乎同时接收到通知的方法.介绍下目前在用的,希望能够抛砖引玉. 首先随便贴一下观察者模式的两接口,观察者模式自行搜索设计模式. public interface IS ...

  7. [转载]——说说IO

    本文转载自"和你在一起"的"说说IO"系列文章https://pengjiaheng.iteye.com/,总共分为8篇,特意整理.收录在此,支持原创.尊重原创 ...

  8. postman的简单使用

    Postman简单的使用  什么是Postman 在程序开发中用于调试网络程序或者跟踪网页请求.可以对网页进行简单的基本信息调试.Postman最早是作用chrome浏览器插件存在的,但是2018年初 ...

  9. RocketMQ三主三从二命名服务平滑版本升级实操

    ​本文介绍本次进行RocketMQ平滑过渡升级的实际操作 前文已经介绍过了升级基本原理,主要思想就是先升级NameSrv(命名服务)然后在升级broker节点.broker节点先升级master节点然 ...

  10. RocketMQ从3.5.8升级到4.3.2版本实战记录

    背景 我们在很早之前大约在2015年8月份左右我们开始使用Rocketmq作为公司消息中间件,那个时候RocketMQ还没有捐赠给Acaphe. RocketMQ版本还是3.2.6,中间升级了一次版本 ...