您的位置:首页 > 编程语言 > C#

C#实现程序的版本自动升级更新

2010-05-11 11:23 676 查看
我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: