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

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

  • 相关阅读:
    .NET常见问题收集
    .NET 常用转换
    Android 百度地图开发setOnTouchListener方法给mapView设置了OnTouchListener后地图无法拖动的问题
    Android_参考
    常用操作
    Android开发笔记——Eclipse 关联Android源码
    Android开发笔记静态变量问题
    无法载入 mysql 扩展,<br />请检查 PHP 配置 解决办法
    服务器维护
    cocos2d 左下角三行
  • 原文地址:https://www.cnblogs.com/top5/p/1691938.html
Copyright © 2020-2023  润新知