公司主要項目為CS端,經常遇到客戶需求變更及bug處理,在沒有引用自動更新之前每次更新程序,必須手動對每個客戶端進行更新,這樣導致技術支持工作量特別大,也給客戶不好的印象,因此我需要一個自動更新程序!
我們實現自動更新大概有這2種實現方式:
一、通過TCP網絡通訊的方式,客戶端程序監聽,當服務端有更新文件的時候,自動比對本地版本,如果服務器版本大於本地版本就可以更新,這種實時性好,不需要等到客戶第二次重啟的時候才發現有版本更新
二、在服務端部署文件更新服務器,通過Web訪問。同樣是當服務端有更新文件的時候,平台第二次打開自動比對本地版本,如果服務器版本大於本地版本就可以更新,這種需要客戶在第二次運行平台的時候才有效(可能有同學說可以在客戶端實時下載讀取服務端文件進行對比,但一般不這樣做)
我們下面主要講第二種實現方式:
自動更新實現原理:運行客戶端先啟動自動更新程序,程序會先通過升級文件所在服務器端的網址下載服務器上面的UpdateList.xml到本來臨時文件夾,再與本地UpdateList.xml內容進行版本比較,當服務器版本上有文件大於本地版本的時候,就把對應文件下載下來進行覆蓋更新工作(如果是壓縮文件新進行解壓);自動更新完成后啟動客戶端程序關閉自動更新程序;
自動更新實現准備工作: 1.發布一個web自動更新文件站點,里面包括需要更新的文件及UpdateList.xml(描述更新文件列表、版本、時間、更新文件服務器所在地址等);

<?xml version="1.0" encoding="utf-8" ?> <AutoUpdate> <!--升級文件所在服務器端的網址--> <URLAddress URL="http://127.0.0.1/SecWS/update"/> <Application> <!--主程序入口--> <EntryPoint ApplicationID="SFBR_ABDoorMangerSystem.exe"/> <Location ip="127.0.0.1"/> <Version Num="1.0.0.0"/> </Application> <UpdateInfo> <!--升級文件的更新日期--> <UpdateTime Date= "2017-01-22 12:00"/> <!--升級文件的版本號(每次更新必須升級版本)--> <Version Num= "9.0.0.0"/> </UpdateInfo> <UpdateFileList> <!--升級文件列表--> <UpdateFile Ver="1.0.0.0" FileName= "updateAB.rar" ContentLength="21k"/> </UpdateFileList> </AutoUpdate>
2.因有時一次更新文件比較大,需要能對文件進行壓縮后,通過自動更新程序下載到本地再解壓(支持壓縮解壓及單個文件更新)
3.自動更新程序需要需要實現這個InterfaceAutoUpdateMng接口,客戶端通過這個反射調用該接口是否有更新

/// <summary> /// 自動更新接口 /// </summary> public interface InterfaceAutoUpdateMng { /// <summary> /// 判斷是否有更新 /// </summary> /// <returns></returns> bool IsUpdate(); }

public class AUpdateMng : InterfaceAutoUpdateMng { #region 屬性 private FrmUpdate frmU; #endregion public AUpdateMng() { } #region 方法 /// <summary> /// 判斷是否有更新 /// </summary> /// <returns></returns> public bool IsUpdate() { if (frmU == null) { frmU = new FrmUpdate(); frmU.Name = "frmU"; } return frmU.IsUpdate; } #endregion }
4.客戶端運行之前先檢查是否更新,所以必須在客戶運行之前啟動自動更新程序檢查是否有更新,如下代碼:

static class Program { /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); AppDomain.CurrentDomain.UnhandledException += delegate { cGlobe_Log.Error(cGlobe_Log.GetMethodInfo() + "異常退出"); }; try { InterfaceAutoUpdateMng autoupdate = null; bool bl; string strPath = Application.StartupPath + "\\AutoUpdate.exe"; if (System.IO.File.Exists(strPath)) { autoupdate = System.Reflection.Assembly.LoadFrom(strPath).CreateInstance("AutoUpdate.AUpdateMng") as InterfaceAutoUpdateMng; } else { autoupdate = null; } if (autoupdate == null) bl = false; else bl = autoupdate.IsUpdate(); if (bl) { System.Diagnostics.Process.Start(strPath); } else { bool bCreatedNew; System.Threading.Mutex m = new System.Threading.Mutex(false, "TestAutoUpdater", out bCreatedNew); if (bCreatedNew) Application.Run(new Form1()); else { MessageBox.Show("平台已開啟!"); } } } catch (Exception ex) { cGlobe_Log.Error(cGlobe_Log.GetMethodInfo() + ex.Message); } } }
5.自動更新界面如下;
自動更新源碼地址:鏈接:https://pan.baidu.com/s/1WR7eivGNtVsLMP9KeRBd_g 提取碼:9cmq