C#实现程序的版本升级更新
- 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文件的地址。
- view plaincopy to clipboardprint?
- <?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>
- <?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、调用方法代码 如下:
..................................
============ 欢迎各位老板打赏~ ===========
与本文相关的文章
- · The instance of entity type ‘Customer’ cannot be tracked because another instance with the same key value for {‘Id’} is already being tracked.
- · .NET8实时更新nginx ip地址归属地
- · 解决.NET Blazor子组件不刷新问题
- · .NET8如何在普通类库中引用 Microsoft.AspNetCore
- · .NET8 Mysql SSL error
- · ASP.NET Core MVC的Razor视图渲染中文乱码的问题
- · .NETCORE 依赖注入服务生命周期
- · asp.net zero改mysql
- · .NET5面试汇总
- · .Net连接Mysql数据库的Convert Zero Datetime日期问题
- · vue使用element-ui中的Message 、MessageBox 、Notification
- · Asp.Net Core Filter 深入浅出的那些事-AOP