我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能。
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