CS程序自動更新實現原理及代碼(支持多版本多文件更新)


       公司主要項目為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>
View Code

 

        2.因有時一次更新文件比較大,需要能對文件進行壓縮后,通過自動更新程序下載到本地再解壓(支持壓縮解壓及單個文件更新)

        3.自動更新程序需要需要實現這個InterfaceAutoUpdateMng接口,客戶端通過這個反射調用該接口是否有更新

          

    /// <summary>
  /// 自動更新接口
  /// </summary>
    public interface InterfaceAutoUpdateMng
    {
        /// <summary>
        /// 判斷是否有更新
        /// </summary>
        /// <returns></returns>
        bool IsUpdate();
    }
View Code
 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
    }
View Code

     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);
            }
            
        }
    }
View Code

    5.自動更新界面如下;

      自動更新源碼地址:鏈接:https://pan.baidu.com/s/1WR7eivGNtVsLMP9KeRBd_g  提取碼:9cmq 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM