asp.net(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.glzy8.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>http://www.glzy8.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);

  }

  }

  }

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