C/S程序自动升级是一个很重要的功能,原理其实很简单,一般包含两个程序一个是主程序,也就是除了升级功能以外的程序,另一个就是升级程序,常见的360,金山安全卫士都是这样。
主要包括以下几点: 1 比较版本 2下载文件 3更新文件 4启动主程序。但其中的需要注意的细节很多。
一般服务端会有一个配置文件包含最新更新的文件信息的配置文件,当然这些更新信息也可以存到数据库,或者其他地方。客户端(也就是需要更新的那部分程序)也有一个配置文件包含客户端版本信息,这些信息可以存到专门的一个配置文件中,或者是config文件中,没有一定的规定,可以根据实际设计。
在客户端程序启动时,先启动更新程序通过比较本地版本和服务端最新的版本信息判断是否有新版本,如果有可以直接下载,下载完成替换成功后并更新客户端版本信息,启动主程序。
缺点:如果更新速度由于更新的文件很大或者网速很慢,用户不得不等待很长时间,直到下载完成或者下载失败。
优点:处理完成后,启动的直接就是更新后的程序。不会出现由于主程序在运行导致替换文件之类的错误。
另一种方法是, 在客户端段程序启动时,启动更新程序,但更新程序不做版本判断,到客户端更新目录下检查有没有下载的新版本,如果有就更新主程序并更新客户端版本信息,然后启动主程序,如果没有就直接启动主程序。由主程序判断是否有新版本,并在后台下载把文件放到客户端更新目录中,下载完成后,提示用户退出主程序,重新启动,在启动时由更新程序并更新客户端和客户端版本信息。
缺点:由于下载是在主程序的后台运行,可能会影响主程序的处理速度。
优点:避免了由于下载导致用户长时间的等待。
1 比较版本
比较依据:
可以通过文件的最后修改时间,或者使用文件版本作为比较依据,使用文件最后修改时间显然不是标准的做法,但也没有错误,但需要注意日期的格式一定要统一,避免日 期格式不一致导致错误。可以使用Fileinfo类获取最后修改时间,注意时间应该取服务器时间,编译程序集的机器时间应该相同,否则可能导致混乱。
FIleInfo类官网参考
使用文件版本作为标准,则每次修改时必须修改版本号,C#程序就是要修AssemblyInfo.cs文件中的内容了,多了一步,规范多了。Version类处理版本信息并比较。
- AssemblythisAssem=Assembly.GetExecutingAssembly();
- AssemblyNamethisAssemName=thisAssem.GetName();
- Versionver=thisAssemName.Version;
Version类官网参考
当然也有其他的方式,例如MD5校验值比较,文件大小比较,之类的方法。不过个人认为文件大小缺陷很明显,新版本文件就一定比旧文件大吗?不一定吧。重构是可能变小的。
当然如果考虑客户端有不同的版本,都需要升级到最新的版本,显然不同的版本对应的升级文件不同,会更复杂,比较的信息也更多。
获取服务端版本信息:
如果服务端的版本信息存在数据库,直接读取数据库,就可以获取。如果存在配置文件,则可以通过webservice方法获取,或者请求一个网页 通过Response.Write();的方式获取信息,当然这两种方式都要建立虚拟目录或者网站。
2下载文件
存储位置:
如果新版本的文件存在数据库,就直接读取数据库,不过这种方式个人不建议使用,例如更新文件很大时性能不是很好。
存在固定虚拟目录的指定路径下,不失为一种好的方式,但客户端要下载,所以要注意一定要分配下载权限。
下载方式:
直接向通过虚拟路径发出请求,下载文件,由于虚拟路径有下载权限,如果更新需要判断是否有权限,例如要交费后才能下载则不好处理。
另一种方式是向一个网页发送请求,传递不同的查询字符串,网页 通过Response.BinaryWrite();的方式下载文件,则可以判断权限,当然麻烦一些是避免不了的。
下载文件代码
- Uriuri=newUri(downFileUrl+localFileName);
- HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(uri);
- request.Credentials=CredentialCache.DefaultCredentials;
- request.MaximumAutomaticRedirections=4;
- localFileName=Path.GetFileName(localFileName);
-
using(HttpWebResponseresponse=(HttpWebResponse)request.GetResponse())
- {
- StreamreceiveStream=response.GetResponseStream();
-
stringnewPath=Path.Combine(tempFold,localFileName);
-
using(FileStreamfs=newFileStream(newPath,FileMode.Create))
- {
-
Byte[]buffer=newByte[4096];
-
intbytesRead=receiveStream.Read(buffer,0,buffer.Length);
-
while(bytesRead>0){
- fs.Write(buffer,0,bytesRead);
- bytesRead=receiveStream.Read(buffer,0,buffer.Length);
- }
- }
- receiveStream.Close();
- }
3更新文件
更新类型:
直接替换的,例如修改了bug,直接替换的。
新增加的,例如新增加的功能做成了新的类库。
需要删除的,例如有些功能由于重构或者使用了了新方法不需要的。
需要执行的,例如写注册表,注册COM组件的。
每一种处理方式都不一样,需要根据类型分开处理
缺点:升级后,没办法取消升级,像windows的补丁程序可以安装,可以卸载的原理,目前还没有研究明白,希望知道的牛人指导。
当然也可以简单的先卸载,再安装,对于配置文件之类的信息特殊处理一下也可以。
当然如果考虑客户端有不同的版本,都需要升级到最新的版本,显然不同的版本对应的升级文件不同,会更复杂,但基本原理却不变。
4启动主程序
主程序路径的获取:
相对路径 主程序,更新程序,都使用相对路径,缺点是一旦相对路径确定后,后续的更新就不能更改这种目录关系。
注册表 路径都存入注册表,需要时通过注册表交互,主程序写注册表,更新程序读取注册表,缺点是读写注册表需要权限,写的路径也要固定,后续的更新不能改变写在注册表中的位置,也就是注册表路径。
运行程序代码
- privatestaticvoidRunFile(stringdir,stringlocalFileName){
-
stringinfo="运行程序"+localFileName;
-
try{
-
if(File.Exists(Path.Combine(dir,localFileName))){
-
ProcessmyProcess=newProcess();
-
ProcessStartInfopsi=newProcessStartInfo();
- psi.FileName=localFileName;
- psi.WorkingDirectory=dir;
-
psi.UseShellExecute=false;
-
psi.RedirectStandardError=true;
-
psi.CreateNoWindow=true;
-
psi.RedirectStandardOutput=true;
- psi.WindowStyle=ProcessWindowStyle.Hidden;
- myProcess.StartInfo=psi;
- myProcess.Start();
-
stringerror=myProcess.StandardError.ReadToEnd();
-
stringoutput=myProcess.StandardOutput.ReadToEnd();
- myProcess.WaitForExit();
- myProcess.Close();
-
if(error!=string.Empty){
-
Log.Write("StandardError:"+error);
- }
-
if(output!=string.Empty){
-
Log.Write("StandardOutput:"+output);
- }
- Log.LogProcessEnd(info);
- }
- }
-
catch(Exceptionex){
-
Log.Write(info+"出错");
- Log.LogException(ex);
-
throwex;
- }
- }
- }
源代码下载
分享到:
相关推荐
c#实现软件自动升级 的原理实现说明!具有详细的文字说明!
javaFx自动升级布署工具,用ant构建,根据生成的app.xml比对更新
C#实现自动升级+自动更新+自动覆盖+源码+思路原理,思路清晰!
升级原理为读取网站服务器上事先提供的版本号及升级地址进行升级.本程序提供了三种不同服务器上的页面程序(适合于ASP,JSP,PHP主机)可供大家选择.也可以根据需要改为HTML格式的,采用动态页面的程序主要是为了以后...
不同软件自动升级的原理都是类似的。首先,客户端程序运行时,得到服务器数据库中该软件的最新版本信息,与客户端程序当前的版本信息进行比较,如果两者一致,则说明当前系统已经是最新的版本了,若服务器端的版本号...
本文针对目前C/S模式下编写的应用程序可维护性差的特点,提出了一套自动在线升级的解决方案,分析了在线升级的困难及实现原理,并给出了实现升级的部分代码,具有实际参考价值和现实意义。本文程序代码均在.Net ...
生物芯片阅读仪基本原理及组成培训 生物芯片阅读仪基本原理及组成 组成:芯片图像采集、芯片传送、光源、芯片图像检测分析共四个系统。 硬件设计上实现了样品自动送入、送出,...(5)软件可以实现远程自动升级功能。
本文针对目前C/S模式下编写的应用程序可维护性差的特点,提出了一套自动在线升级的解决方案,分析了在线升级的困难及实现原理,并给出了实现升级的部分代码,具有实际参考价值和现实意义。本文程序代码均在.Net ...
网页自动登录(提交Post内容)的用途很多,如验证身份、程序升级、网络投票等,以下是用C#实现的方法。 网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以用来提取网页HTML的组件比较多...
针对目前C/S模式下编写的应用程序可维护性差的特点,提出了一套自动在线升级的解决方案,分析了在线升级的困难及实现原理,并给出了实现升级的部分代码,具有实际参考价值和现实意义
升级原理为读取网站服务器上事先提供的版本号及升级地址进行升级.本程序提供了三种不同服务器上的页面程序(适合于ASP,JSP,PHP主机)可供大家选择.也可以根据需要改为HTML格式的,采用动态页面的程序 主要是为了以后...
原理是WFormSrc 在起动时检测本地的版本与服务器上的版本进行比较,如果不同则起动Update.exe进行升级,同时更新本地的版本设置 Update.exe不要放在服务器上 每次升级时只需要更改服务器上的配置文件的版本,同是把...
通过对综采工作面泵站自动控制系统的工作原理、系统组成、基本功能及关键元部件的分析,阐述了采用泵站自动控制的优点,认为采用泵站自动控制系统是综采工作面技术升级的必然结果,是综采工作面向智能型发展所不可缺少...
VB自动升级软件的程序源码,根据异步下载的原理实现,类似于程序在后台自动下载升级包的程序,没有使用winsock、inte等控件,只是用了控件的一些方法来实现的,测试程序将从微软官方网站下载一个程序包,具体的实现...
Tiger Update实现自动更新实现的原理如下: 1. 通过Tiger Installer制作安装程序和升级包 2. 在一个Web Server上增加一个取得最新版本的链接和一个下载升级包的链接。 3. 软件通过Tiger Update组件取得最新版本和...
自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语;最新版本的url等)。然后我们给出提示框,用户点击开始...
首先,在分析旋转变压器/感应同步器,RDC变换以及CPLD芯片和ISA总线工作原理的基础上,确定了以轴角转换芯片AD2S1210为核心,配置以CPLD芯片完成测量角度后续处理的电路实现方案。电路结构简洁、灵活,CPLD芯片的...
STM32储能逆变器资料,提供原理图,pcb,源代码。 基于STM32F103设计,具有并网充电、放电;...4. 并网离网自动切换:储能逆变器能够根据需要,自动实现从并网模式到离网模式的切换,以实现更好的供电管理。 5. 485通讯
阐述了IAP技术原理,介绍了远程升级方案的思路、实现方法以及设计时应注意的关键问题。该方案一方面可保障升级数据包的正确传送,另一方面可保证在升级中断时自动运行升级前的程序,从而保证了升级过程的安全性。大量...
ZYNQ UltraScale+ MPSoc ZU5EV核心板原理图, Zynq UltraScale+MPSoC是Xilinx推出的第二代多处理SoC系统,它在第一代Zynq-7000的基础上进行了全面升级。 该芯片基于业内最先进的16nm FinFET+工艺制程打造,整合了64...