C#实现程序的版本升级更新

摘要:
当我们制作一个程序时,必然会有版本升级,这就要求程序具有自动版本升级的功能。使用系统;使用System.Collections.Generic;使用System.Text;使用System.Reflection;使用System.IO;使用System.Net;使用System.Xml;NamespaceUpdate{//////由更新完成触发的事件///publicdelegatevoidUpdateState();//////程序更新///publicclassSoftUpdate{private string download;private conststring updateUrl=“http://www.csdn.net/update.xml“;//升级配置的XML文件地址#region构造函数publicSoftUpdate(){}/////程序更新//////文件以更新publicSoftUpdate{this.LoadFile=file;this.SoftName=SoftName;}#Endregion#region属性privaterunloadFile;privatestrignewVerson;privatestringsoftName;privateboolisUpdate;/////或获取是否更新////publictoolIsUpdate{get{checkUpdate();returnisUpdate;}}/////要检查更新的文件////publicstringLoadFile{get{returnloadFile;}set{loadFile=value;}////程序集的新版本////˂/publicstringNewVerson{get returnnewVerson;}/////升级的名称////˂/publicstrigSoftName{get{returnsoftName;}set{softName=value;}}#endregion/////更新完成时触发的事件////publiceventUpdateStateUpdateFinish;privatevoidisFinish(){if(UpdateFinish!

我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能。

那么看看我是如何实现程序自动更新的。

直接上代码:

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Reflection;  
  5. using System.IO;  
  6. using System.Net;  
  7. using System.Xml;  
  8.   
  9. namespace Update  
  10. {  
  11.     /// <summary>  
  12.     /// 更新完成触发的事件  
  13.     /// </summary>  
  14.     public delegate void UpdateState();  
  15.     /// <summary>  
  16.     /// 程序更新  
  17.     /// </summary>  
  18.     public class SoftUpdate  
  19.     {  
  20.   
  21.         private string download;  
  22.         private const string updateUrl = "http://www.csdn.net/update.xml";//升级配置的XML文件地址  
  23.  
  24.         #region 构造函数  
  25.         public SoftUpdate() { }  
  26.   
  27.         /// <summary>  
  28.         /// 程序更新  
  29.         /// </summary>  
  30.         /// <param name="file">要更新的文件</param>  
  31.         public SoftUpdate(string file,string softName) {  
  32.             this.LoadFile = file;  
  33.             this.SoftName = softName;  
  34.         }   
  35.         #endregion  
  36.  
  37.         #region 属性  
  38.         private string loadFile;  
  39.         private string newVerson;  
  40.         private string softName;  
  41.         private bool isUpdate;  
  42.   
  43.         /// <summary>  
  44.         /// 或取是否需要更新  
  45.         /// </summary>  
  46.         public bool IsUpdate  
  47.         {  
  48.             get   
  49.             {  
  50.                 checkUpdate();  
  51.                 return isUpdate;   
  52.             }  
  53.         }  
  54.   
  55.         /// <summary>  
  56.         /// 要检查更新的文件  
  57.         /// </summary>  
  58.         public string LoadFile  
  59.         {  
  60.             get { return loadFile; }  
  61.             set { loadFile = value; }  
  62.         }  
  63.   
  64.         /// <summary>  
  65.         /// 程序集新版本  
  66.         /// </summary>  
  67.         public string NewVerson  
  68.         {  
  69.             get { return newVerson; }  
  70.         }  
  71.   
  72.         /// <summary>  
  73.         /// 升级的名称  
  74.         /// </summary>  
  75.         public string SoftName  
  76.         {  
  77.             get { return softName; }  
  78.             set { softName = value; }  
  79.         }  
  80.  
  81.         #endregion  
  82.   
  83.         /// <summary>  
  84.         /// 更新完成时触发的事件  
  85.         /// </summary>  
  86.         public event UpdateState UpdateFinish;  
  87.         private void isFinish() {  
  88.             if(UpdateFinish != null)  
  89.                 UpdateFinish();  
  90.         }  
  91.   
  92.         /// <summary>  
  93.         /// 下载更新  
  94.         /// </summary>  
  95.         public void Update()  
  96.         {  
  97.             try  
  98.             {  
  99.                 if (!isUpdate)  
  100.                     return;  
  101.                 WebClient wc = new WebClient();  
  102.                 string filename = "";  
  103.                 string exten = download.Substring(download.LastIndexOf("."));  
  104.                 if (loadFile.IndexOf(@"\") == -1)  
  105.                     filename = "Update_" + Path.GetFileNameWithoutExtension(loadFile) + exten;  
  106.                 else  
  107.                     filename = Path.GetDirectoryName(loadFile) + "\\Update_" + Path.GetFileNameWithoutExtension(loadFile) + exten;  
  108.                 wc.DownloadFile(download, filename);  
  109.                 wc.Dispose();  
  110.                 isFinish();  
  111.             }  
  112.             catch  
  113.             {  
  114.                 throw new Exception("更新出现错误,网络连接失败!");  
  115.             }  
  116.         }  
  117.   
  118.         /// <summary>  
  119.         /// 检查是否需要更新  
  120.         /// </summary>  
  121.         public void checkUpdate()   
  122.         {  
  123.             try {  
  124.                 WebClient wc = new WebClient();  
  125.                 Stream stream = wc.OpenRead(updateUrl);  
  126.                 XmlDocument xmlDoc = new XmlDocument();  
  127.                 xmlDoc.Load(stream);  
  128.                 XmlNode list = xmlDoc.SelectSingleNode("Update");  
  129.                 foreach(XmlNode node in list) {  
  130.                     if(node.Name == "Soft" && node.Attributes["Name"].Value.ToLower() == SoftName.ToLower()) {  
  131.                         foreach(XmlNode xml in node) {  
  132.                             if(xml.Name == "Verson")  
  133.                                 newVerson = xml.InnerText;  
  134.                             else  
  135.                                 download = xml.InnerText;  
  136.                         }  
  137.                     }  
  138.                 }  
  139.   
  140.                 Version ver = new Version(newVerson);  
  141.                 Version verson = Assembly.LoadFrom(loadFile).GetName().Version;  
  142.                 int tm = verson.CompareTo(ver);  
  143.   
  144.                 if(tm >= 0)  
  145.                     isUpdate = false;  
  146.                 else  
  147.                     isUpdate = true;  
  148.             }  
  149.             catch(Exception ex) {  
  150.                               throw new Exception("更新出现错误,请确认网络连接无误后重试!");  
  151.             }  
  152.         }  
  153.   
  154.         /// <summary>  
  155.         /// 获取要更新的文件  
  156.         /// </summary>  
  157.         /// <returns></returns>  
  158.         public override string ToString()  
  159.         {  
  160.             return this.loadFile;  
  161.         }  
  162.     }  
  163. }  

把代码编译为一个类库文件,通过程序引用就OK啦。

传入的参数已经有注释了。

下面是更新的XML文件类容,传到空间上面就可以了,得到XML文件的地址。

  1. <?xml version="1.0" encoding="utf-8" ?>   
  2. <Update>  
  3.    <Soft Name="BlogWriter">  
  4.      <Verson>1.0.1.2</Verson>   
  5.      <DownLoad>http://www.csdn.net/BlogWrite.rar</DownLoad>   
  6.   </Soft>  
  7. </Update>  

程序更新调用方法:

 1、先引用上面的DLL。

 2、调用方法代码 如下:

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. using System.IO;  
  9. using System.Threading;  
  10. using System.Net;  
  11. using System.Xml;  
  12. using Update;  
  13.   
  14. namespace UpdateTest  
  15. {  
  16.     public partial class Form1 : Form  
  17.     {  
  18.         public Form1()  
  19.         {  
  20.             InitializeComponent();  
  21.             checkUpdate();  
  22.         }  
  23.   
  24.         public void checkUpdate()  
  25.         {  
  26.             SoftUpdate app = new SoftUpdate(Application.ExecutablePath, "BlogWriter");  
  27.             app.UpdateFinish += new UpdateState(app_UpdateFinish);  
  28.             try  
  29.             {  
  30.                 if (app.IsUpdate && MessageBox.Show("检查到新版本,是否更新?""Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)  
  31.                 {  
  32.   
  33.                     Thread update = new Thread(new ThreadStart(app.Update));  
  34.                     update.Start();  
  35.                 }  
  36.             }  
  37.             catch (Exception ex)  
  38.             {  
  39.                 MessageBox.Show(ex.Message);  
  40.             }  
  41.         }  
  42.   
  43.         void app_UpdateFinish() {  
  44.                 MessageBox.Show("更新完成,请重新启动程序!""Update", MessageBoxButtons.OK, MessageBoxIcon.Information);  
  45.         }  
  46.   
  47.     }  
  48. }  

好了,整个程序到此结束。如觉得有哪里不正确或者有疑问的请给我留言。

免责声明:文章转载自《C#实现程序的版本升级更新》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇zTree基本功能[core]Linux下获得系统时间的C语言实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

配置之XML--读取XML文件 转存为Key-Value

将XML文件读取 绑定数据至Dictionary Eg: Xml文件 <?xml version="1.0" encoding="utf-8" ?> <LanguageConfig> <Chinese></Chinese> <English>002</English> &...

java使用freemarker模板导出word(带有合并单元格)文档

来自:https://blog.csdn.net/qq_33195578/article/details/73790283 前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并单元格的,可是查了好久都没有自己想要的。研究了几天其实挺简单的,在这儿我就简单的介绍一下吧!(此方法只是一种思路,借鉴者还有根据需求来具体写代码) 一、准备...

多表更新:update,join

1、多表更新:   下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法。 前期准备工作: update join_teacher_class join join_teacher    on join_teacher_class.t_id=join_teacher.id    set begin_da...

JAX-WS HandlerChain使用详解

JAX-WS的Handler和Servlet的Filter相似,可以对所有WebServicer进行拦截,在Handler中可以记录日志、权限控制、对请求的SOAP消息进行加密,解密等。JAX-WS提供两个Handler接口,LogicalHandler和SOAPHandler。LogicalHandler处理的是Message Payload,只能够访...

使用JAVA调用KRPANO加密XML

KRPano自带的命令行工具krpanotools可以加密XML,具体的参数说明如下语法:   krpanotools32.exe encrypt [OPTIONS] inputfiles inputfiles 参数可以是任意个数的文件 (支持*) 选项:-h5 … 使用HTML5兼容的加密方式-bin … 使用仅支持Flash的加密方式-p ...

android 项目中设置背景图片

xml文件设置背景图片中:任意一个控件,button imageView 或layout,在其的xml属性设置中,添加 [XML] view plaincopy android:background="@drawable/bg"     即可实现设置其背景图片为bg. 图片存放在drawable目录下。 drawable目录下存放大小图标...