我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能。
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 }转 http://www.csharpwin.com/csharpspace/10829r586.shtml