C/S架构的应用程序需要支持自动更新功能,当新版本程序发布后,正在运行的客户端能检测到新版本的程序,通知用户是否下载更新。工作以来参与过几个自动更新模块的设计与维护,撰文总结自动更新模块设计与实现。

自动更新组件主要内容

1  版本比较。旧版本如何检测到新版本,版本信息是程序集自描述的,还是用单独的文件保存。.NET程序集是自描述的,程序集包含以下几种版本信息,每个Assebmly包含三个Version
AssemblyFileVersion : 存储在Win32资源中, CLR不关心这个版本号。
AssemblyInformationnalVersion :存储在Win32资源中, CLR不关心这个版本号。
AssemblyVersion: 存储在AssemblyDef manifest metadata table中,CLR会使用这个版本号。

标准版本号物理形式表示为用句点隔开的四段数字,如下面的代码示例所示。
<major version>.<minor version>.<build number>.<revision>
实际使用中,我们一般只用到前面三段。即
<major version>.<minor version>.<build number>

版本比较举例:

旧版本 2.4.1.2

新版本 2.4.1.3 或 2.4.2.2 或2.5.1.2。

2 程序下载。采用何种方式,从哪里下载最新版本的程序。

1) Http 协议。从IIS或Tomcat 等Web服务器中下载新版本的程序文件。

2) Ftp协议。从Ftp服务器下载新版本的程序文件。

3) 局域网共享。从内部局域网下载新版本的程序文件。

下载过程中应该支持断点续传,支持以压缩文件的方式传输,下载完成后自动解压缩,执行更新。还可以参考Windows的BITS更新服务,BITS (后台智能传送服务) 是一个 Windows 组件,它可以在前台或后台异步传输文件,为保证其他网络应用程序获得响应而调整传输速度,并在重新启动计算机或重新建立网络连接之后自动恢复文件传输。

为了达到传输过程中速度最优化,可以考虑调用第三方下载API,实现穿越局域网时,下载速度最快。

4) ClickOnce方式。将程序部署在IIS网站中,配置ClickOnce,参考文章 ClickOnce部署。

3 执行更新。如果更新程序是压缩格式的zip/rar格式文件,可解压缩后复制到应用程序目录即可。如果更新程序是安装格式的Installer文件,则需要先退出当前程序,启动安装程序包。

当前程序正在执行时,将更新程序覆盖过来,会遇到文件被进程占用的情况,有以下三种解决方案:

1) 根据更新程序生成一个批处理命令,主要内容是将更新程序中的文件复制到当前程序所在文件夹。命令主要包含以下三个部分,退出当前程序,执行文件复制,启动应用程序。

2) 应用程序启动一个独立的更新程序Update.EXE,由更新程序完成文件的复制和程序的启动。

3) 调用Volume Shadow Copy Service,这个服务支持当文件正在被进程使用,仍可以复制。

详细参考以下网站信息 Volume Shadow Copy Service。

文件的存储方式

1) 文件包含版本信息,举例EnterpriseSolution-5.3.0.0-20150401.zip,表示是5.3版本的,构建日期是2015年4月1日。在检测更新文件时,需要遍历同版本或是高版本的文件,取最新的那个文件。

2) 文件不包含版本信息,需要用独立的描述文件表达版本信息。比如

<?xml version="1.0" encoding="utf-8" ?>
<Content><Project id="Enterprise.Sales.dll" Edition="1.2"> </Project><Project id="Enterprise.Purchasing.dll" Edition="1.2"> </Project><Project id="Enterprise.Inventory.dll" Edition="1.3"> </Project><Project id="Enterprise.GeneralLedger.dll" Edition="1.5"> </Project>
</Content>

通过这个描述文件,找到最新版本的文件,分批下载回来。对于服务器中存在多个版本的文件情况,可用文件夹(1.2,1.5)的方式将各版本的程序文件放在各自的目录中,通过上面的版本描述文件分别在各自的版本目录中寻找文件。

版本检测

检测版本,发现新版本后启动更新程序Update.EXE,退出当前程序。

string clientVersion = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly().Location).ProductVersion;
string serverVersion = FileVersionInfo.GetVersionInfo("Main.exe", server)).ProductVersion;if (new Version(serverVersion).CompareTo(new Version(clientVersion)) > 0)
{var process = new Process{StartInfo = new ProcessStartInfo{FileName = "Update.exe",Arguments = "LOCAL"}};process.Start();Environment.Exit(0);
}
 
 

外壳程序

启动外壳程序,在局域网(工作组)中常用来解决权限问题。

private static void Shell(string arguments)
{Process process = new Process();ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe", arguments);processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;process.StartInfo = processStartInfo;process.Start();
}
 

常用在net use命令,举例如下:

net use ipipc$ " " /user:" " 建立IPC空链接

net use ipipc$ "密码" /user:"用户名" 建立IPC非空链接

net use h: ipc$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:

net use h: ipc$ 登陆后映射对方C:到本地为H:

网络连接检查

当准备检测更新时,我需要检测网络是否通畅,需要用下面的方法:

1) 局域网模式下,用SystemInformation.Network可达到目的。

2) 要从外网下载程序,需要检查外网是否连通,可以采用PING一个IP地址的方式,要求这个IP地址或是域名非常稳定。

可以调用C#的Ping类型完成目的,参考代码:

Ping ping = new Ping();
PingOptions poptions = new PingOptions();
poptions.DontFragment = true;

也可以调用COM接口InternetGetConnectedState,用于检测网络连接状态。

[DllImport("wininet")]
private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);

参考说明 InternetGetConnectedState function。

stackoverflow中有一篇讲解判断网络连接的问答,地址是http://stackoverflow.com/questions/13457407/why-is-getisnetworkavailable-always-returning-true。

要检测广域网是否连接,需要使用InternetGetConnectedState()或WinINet API。

解析大型.NET ERP系统 自动更新相关推荐

  1. 解析大型.NET ERP系统:十三种界面设计模式

    成熟的ERP系统的界面应该都是从模板中拷贝出来的,各类功能的界面有规律可遵循.软件界面设计模式化或是艺术性的创作,我认可前者,模式化的界面客户容易举一反三,降低学习门槛.除了一些小部分的功能界面设计特 ...

  2. 解析大型.NET ERP系统架构设计 Framework+ Application 设计模式

    我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应该具备良好的可扩展性和可维护性,系统中的功能紧密关联.除去业务上的复杂性,如何设计这样的一个协 ...

  3. 解析大型.NET ERP系统 设计异常处理模块

    异常处理模块是大型系统必备的一个组件,精心设计的异常处理模块可提高系统的健壮性.下面从我理解的角度,谈谈异常处理的方方面面.我的设计仅仅限定于Windows Forms,供参考. 1 定义异常类型 . ...

  4. 解析大型.NET ERP系统 20条数据库设计规范

    数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到.当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考.在程序框架中,也有一份强制性的约定,当不遵守规范时报错 ...

  5. 解析大型.NET ERP系统 高质量.NET代码设计模式

    1 缓存 Cache 系统中大量的用到缓存设计模式,对系统登入之后不变的数据进行缓存,不从数据库中直接读取.耗费一些内存,相比从SQL Server中再次读取数据要划算得多.缓存的基本设计模式参考下面 ...

  6. 解析大型.NET ERP系统 多国语言实现

    实现多国语言有许多种实现方案,无外乎是一种字符串替换技术,将界面控件的文本标签替换成相应语言的文字..NET Windows Forms实现多国语言的方法有以下几种: 1 .NET的方案,使用资源文件 ...

  7. 解析大型.NET ERP系统 设计通用Microsoft Excel导入功能

    做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到 ...

  8. 屏蔽 iOS 系统自动更新

    iOS 系统自动更新非常讨厌,经常会悄悄的下载最新的系统,提示让你安装.屏蔽系统更新的方法是安装描述文件,使用 Safari 浏览器访问 https://exchen.net/ota.mobileco ...

  9. 网络安全08-虚拟机运行架构(寄居架构+原生架构)、虚拟机产品简单介绍、windows操作系统--屏蔽系统自动更新

    网络安全08_ 一.虚拟机运行架构 (1)寄居架构-便宜,自主学习使用(实验环境,测试环境) 虚拟机作为应用软件安装在操作系统上 可以在此应用软件上安装多个操作系统 直接安装在硬件上的系统为宿主 虚拟 ...

  10. 苹果怎么关闭系统自动更新_你经过我的同意了吗?论手机系统自动更新

    说起手机系统的更新,相信大致是有两个党派,一个是有出必追,第一时间更新到最新系统,体验新特性,修复已知BUG,二就是保守派,认为买来时自带的系统版本即是最好用的,不喜升级,更不喜手机动不动就弹出的更新 ...

最新文章

  1. Android 设置透明的方法
  2. 竟然是它:# vi /etc/resolv.conf
  3. 设计模式原则--单一职责原则
  4. 安卓开发重磅炸弹!程序员福利!《高级Kotlin强化实战学习手册(附Demo)》开放下载!
  5. CRUD之delete操作
  6. 关于JS阶乘,首字母大写,最长单词计算,重复说话次数等简单基础算法练习...
  7. TIOBE 7 月编程语言榜:TypeScript 进入前 50 名
  8. shellcode编写
  9. 关于网站注册账号时提示Server 对象 错误 'ASP 0177 : 800401f3'
  10. python 加速运算
  11. 基于FPGA的数字信号处理3.7开平方运算分析
  12. 商业智能系统在税务行业的应用
  13. 易语言MYSQL记账工具_易语言做记账软件
  14. 灵性图书馆:好书推荐-《荷欧波诺波诺的幸福奇迹》
  15. 带你了解热门IoT开源项目:home assistant
  16. 组网胖模式_常听到别人说胖AP和瘦AP组网,都有什么区别呢?
  17. DAppStore率先集成ChatGPT助力App安全开发
  18. 在桌面上显示IP地址等信息
  19. 20 项任务全面碾压 BERT,CMU 全新 XLNet 模型屠榜,代码已开源!
  20. 不是吧,不是吧,这年头还有人不知道算法的重要性?我进字节年薪45w+全靠大佬这份笔记!

热门文章

  1. C语言的结构变量定义规则,嵌入式学习笔记:c语言结构体的定义和使用
  2. Scala学习数组/映射/元组
  3. 【PRML 学习笔记】第一章 - 介绍 (Introduction)
  4. 1537 学生干部虚基类
  5. 微信小程序 this.data与this.setData
  6. echarts的pie图中,各区块颜色的调整
  7. HTML5(FileRdeader)
  8. Linux下不同颜色文件的类型
  9. ubuntu 14.04 gitlab 的搭建
  10. virtual studio 2017 配置vistual assist激活