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

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

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

直接上代码:

 

  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"& gt;要更新的文件</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. }  

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值