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

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

2013-02-05 14:44 761 查看
我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能。
那么看看我是如何实现程序自动更新的。

直接上代码:

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