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


    我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能。那么看看我是如何实现程序自动更新的。

    直接上代码:

    using System;  
    using System.Collections.Generic;  
    using System.Text;  
    using System.Reflection;  
    using System.IO;  
    using System.NET;  
    using System.Xml;  
      
    namespace Update  
    {  
        /// <summary>  
        /// 更新完成触发的事件  
        /// </summary>  
        public delegate void UpdateState();  
        /// <summary>  
        /// 程序更新  
        /// </summary>  
        public class SoftUpdate  
        {  
      
            private string download;  
            private const string updateUrl = "http://www.csdn.Net/update.xml";//升级配置的XML文件地址  
     
            #region 构造函数  
            public SoftUpdate() { }  
      
            /// <summary>  
            /// 程序更新  
            /// </summary>  
            /// <param name="file">要更新的文件</param>  
            public SoftUpdate(string file,string softName) {  
                this.LoadFile = file;  
                this.SoftName = softName;  
            }   
            #endregion  
     
            #region 属性  
            private string loadFile;  
            private string newVerson;  
            private string softName;  
            private bool isUpdate;  
      
            /// <summary>  
            /// 或取是否需要更新  
            /// </summary>  
            public bool IsUpdate  
            {  
                get   
                {  
                    checkUpdate();  
                    return isUpdate;   
                }  
            }  
      
            /// <summary>  
            /// 要检查更新的文件  
            /// </summary>  
            public string LoadFile  
            {  
                get { return loadFile; }  
                set { loadFile = value; }  
            }  
      
            /// <summary>  
            /// 程序集新版本  
            /// </summary>  
            public string NewVerson  
            {  
                get { return newVerson; }  
            }  
      
            /// <summary>  
            /// 升级的名称  
            /// </summary>  
            public string SoftName  
            {  
                get { return softName; }  
                set { softName = value; }  
            }  
     
            #endregion  
      
            /// <summary>  
            /// 更新完成时触发的事件  
            /// </summary>  
            public event UpdateState UpdateFinish;  
            private void isFinish() {  
                if(UpdateFinish != null)  
                    UpdateFinish();  
            }  
      
            /// <summary>  
            /// 下载更新  
            /// </summary>  
            public void Update()  
            {  
                try  
                {  
                    if (!isUpdate)  
                        return;  
                    WebClient wc = new WebClient();  
                    string filename = "";  
                    string exten = download.Substring(download.LastIndexOf("."));  
                    if (loadFile.IndexOf(@"/") == -1)  
                        filename = "Update_" + Path.GetFileNameWithoutExtension(loadFile) + exten;  
                    else  
                        filename = Path.GetDirectoryName(loadFile) + "//Update_" + Path.GetFileNameWithoutExtension(loadFile) + exten;  
                    wc.DownloadFile(download, filename);  
                    wc.Dispose();  
                    isFinish();  
                }  
                catch  
                {  
                    throw new Exception("更新出现错误,网络连接失败!");  
                }  
            }  
      
            /// <summary>  
            /// 检查是否需要更新  
            /// </summary>  
            public void checkUpdate()   
            {  
                try {  
                    WebClient wc = new WebClient();  
                    Stream stream = wc.OpenRead(updateUrl);  
                    XmlDocument xmlDoc = new XmlDocument();  
                    xmlDoc.Load(stream);  
                    XmlNode list = xmlDoc.SelectSingleNode("Update");  
                    foreach(XmlNode node in list) {  
                        if(node.Name == "Soft" && node.Attributes["Name"].Value.ToLower() == SoftName.ToLower()) {  
                            foreach(XmlNode xml in node) {  
                                if(xml.Name == "Verson")  
                                    newVerson = xml.InnerText;  
                                else  
                                    download = xml.InnerText;  
                            }  
                        }  
                    }  
      
                    Version ver = new Version(newVerson);  
                    Version verson = Assembly.LoadFrom(loadFile).GetName().Version;  
                    int tm = verson.CompareTo(ver);  
      
                    if(tm >= 0)  
                        isUpdate = false;  
                    else  
                        isUpdate = true;  
                }  
                catch(Exception ex) {  
                                  throw new Exception("更新出现错误,请确认网络连接无误后重试!");  
                }  
            }  
      
            /// <summary>  
            /// 获取要更新的文件  
            /// </summary>  
            /// <returns></returns>  
            public override string ToString()  
            {  
                return this.loadFile;  
            }  
        }  
    }  

    把代码编译为一个类库文件,通过程序引用就OK啦。传入的参数已经有注释了。

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

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

    程序更新调用方法:

     1、先引用上面的DLL。

     2、调用方法代码 如下

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Threading;
    using System.Net;
    using System.Xml;
    using Update;
    
    namespace UpdateTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                checkUpdate();
            }
    
            public void checkUpdate()
            {
                SoftUpdate app = new SoftUpdate(Application.ExecutablePath, "BlogWriter");
                app.UpdateFinish += new UpdateState(app_UpdateFinish);
                try
                {
                    if (app.IsUpdate && MessageBox.Show("检查到新版本,是否更新?", "Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
    
                        Thread update = new Thread(new ThreadStart(app.Update));
                        update.Start();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            void app_UpdateFinish()
            {
                MessageBox.Show("更新完成,请重新启动程序!", "Update", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
    
        }
    }

    好了,整个程序到此结束。

  • 相关阅读:
    linux   截取时间段的日志
    Linux 通过 shell 脚本修改密码
    Centos7下安装netstat
    正文字体大小:大 中 小 解决configure: error: Cannot find libmysqlclient under /usr
    隐藏index.php
    编译安装php Cannot find MySQL header files under /usr/include/mysql.
    解决问题 “You don't have permission to access /index.html on this server.”
    Linux Samba服务器配置
    PHP curl传输文件的版本兼容性
    消息队列feed程序实现中的问题
  • 原文地址:https://www.cnblogs.com/shadowme/p/6250089.html
Copyright © 2020-2023  润新知