自動更新的軟件的目的在于讓客戶不在為了尋找最新軟件花費時間。也不用去到開發商的網站上查找。客戶端的軟件自動會在程序啟動前查找服務器上最新的版本。和自己當前軟件的版本比較,如果服務器的是最新版本。客戶端則進行自動下載、解壓、安裝。當然了下載是要有網絡的,并且用戶可以根據提示去完成操作。再也不用為找不到最新版本的軟件而頭疼。下面是我的大體思路,已經得到了實現:
1、 寫一個webservice,提供一個獲取服務器xml中版本的數據的方法。(也可用其他文件格式, 此處舉例XML)
2、 在WinForm應用程序啟動的時候,首先訪問webservice獲取服務器的xml中的版本號,然后獲取客戶端的xml中的版本號。將兩個版本號比較,若服務器中的版本號大,則提示提示可以在線更新應用程序。
3、 然后客戶端自動下載網絡上的RAR壓縮包到本機的指定位置,進行自動解壓縮。解壓縮完畢之后,用進程打開所解壓過的exe文件進行軟件安裝。同時關閉客戶端軟件所在的進程。
一 web項目中的代碼
首先我給大家先展示下我的web項目中的webservice的代碼,這里面跟簡單,只有一個方法。項目需要發布到IIS上面。
1.1webservice中的代碼

[STAThread] static void Main() { application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); LoadMath(); } PRivate static void LoadMath() { //服務器上的版本號 string NewEdition = string.Empty; //應用程序中的版本號 string OldEdition = string.Empty; try { //獲取webservice上的版本號 myService.WebServiceUpdateSoapClient c = new myService.WebServiceUpdateSoapClient(); NewEdition = c.GetEdition("clkj_ws"); } catch (Exception ex) { MessageBox.Show(ex.Message); } try { //獲取系統中xml里面存儲的版本號 XDocument document = XDocument.Load("XMLEdition.xml"); XElement element = document.XPathSelectElement("Content/Project/Edition"); if (element != null) { OldEdition = element.Value.ToString(); } } catch (Exception exx) { MessageBox.Show(exx.Message); } double newE = double.Parse(NewEdition); double oldE = double.Parse(OldEdition); //比較兩個版本號,判斷應用程序是否要更新 if (newE > oldE) { //更新程序¨° DialogResult dr = MessageBox.Show("發現新的版本是否要更新該軟件", "系統提示?", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); if (dr == DialogResult.OK) { //打開下載窗口 Application.Run(new DownUpdate ()); } else { //若用戶取消,打開初始界面 Application.Run(new Login()); } } }View Code1.2xml中的代碼
<?xml version="1.0" encoding="utf-8" ?>
<Content>
<Project id="p1">
<Name>test</Name>
<Edition>2.0</Edition>
</Project>
</Content>
二 WinForm項目中的代碼
Web項目的代碼就只有上面的一點,重點的還是在WinForm中。在WinForm中首先要添加web引用,將上述的webservice訪問地址復制過來使用。下面我一步一步來為大家解析吧。
第一步:
客戶端的代碼和服務器斷的xml代碼大致相同,不同的只用Edition元素里面的值。
<?xml version="1.0" encoding="utf-8" ?>
<Content>
<Project id="p1">
<Name>test</Name>
<Edition>1.0</Edition>
</Project>
</Content>
在Program.cs(WinForm中設置起始頁的地方)這個類中添加代碼
[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); LoadMath(); } private static void LoadMath() { //服務器上的版本號 string NewEdition = string.Empty; //應用程序中的版本號 string OldEdition = string.Empty; try { //獲取webservice上的版本號 myService.WebServiceUpdateSoapClient c = new myService.WebServiceUpdateSoapClient(); NewEdition = c.GetEdition("clkj_ws"); } catch (Exception ex) { MessageBox.Show(ex.Message); } try { //獲取系統中xml里面存儲的版本號 XDocument document = XDocument.Load("XMLEdition.xml"); XElement element = document.XPathSelectElement("Content/Project/Edition"); if (element != null) { OldEdition = element.Value.ToString(); } } catch (Exception exx) { MessageBox.Show(exx.Message); } double newE = double.Parse(NewEdition); double oldE = double.Parse(OldEdition); //比較兩個版本號,判斷應用程序是否要更新 if (newE > oldE) { //更新程序¨° DialogResult dr = MessageBox.Show("發現新的版本是否要更新該軟件", "系統提示?", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); if (dr == DialogResult.OK) { //打開下載窗口 Application.Run(new DownUpdate ()); } else { //若用戶取消,打開初始界面 Application.Run(new Login()); } } }這個可以省略,沒有實際意義
界面顯示如下圖

自動更新代碼如下(其中更新按鈕的name為btnDown,安裝按鈕的name為btnInstall):

//debug目錄,用于存放壓縮文件t string path = Application.StartupPath; public DownExe() { InitializeComponent(); } private void DownExe_Load(object sender, EventArgs e) { btnInstall.Enabled = false; } //下載文件、自動解壓縮文件 private void btnDown_Click(object sender, EventArgs e) { //自動下載壓縮包,并且解壓,最后關閉當前進程,進行安裝 try { //設置進度條 List<int> resultList = new List<int>(); for (int i = 0; i < 100; i++) { resultList.Add(i); } //設置進度條的最大值和最小值 this.progressBar1.Maximum = resultList.Count; this.progressBar1.Minimum = 0; foreach (int item in resultList) { //下載壓縮包 System.Net.WebClient client = new System.Net.WebClient(); client.DownloadFile(@"http://192.168.1.120/File/setup.rar", path + @"setup.rar"); this.progressBar1.Value++; } } catch { MessageBox.Show("當前沒有網絡或者文件地址不正確"); } if (!Exists()) { MessageBox.Show("不支持RAR解壓縮"); return; } //解a壓1 try { unCompressRAR(path + "http://setup", path, "setup.rar", false);
新聞熱點
疑難解答