服务器之家

服务器之家 > 正文

asp.net(c#)程序版本升级更新的实现代码

时间:2019-08-31 12:06     来源/作者:ASP.NET之家

直接上代码: 

复制代码代码如下:


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 = "//www.zzvips.com/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>//www.zzvips.com/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); 
        } 
    } 


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

标签:

相关文章

热门资讯

华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字 2019-06-05
叠猫猫队长可以退出吗 叠猫猫队长怎么换队伍
叠猫猫队长可以退出吗 叠猫猫队长怎么换队伍 2019-06-05
逃跑吧少年怎么卡皮肤 逃跑吧少年卡永久皮肤技巧
逃跑吧少年怎么卡皮肤 逃跑吧少年卡永久皮肤技巧 2019-06-21
返回顶部