• 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 

     

  • 相关阅读:
    微服务下的持续集成-Jenkins自动化部署GitHub项目
    JDK新特性-Lambda表达式的神操作
    ActiveMQ详细入门教程系列(一)
    程序员必须了解的知识点——你搞懂mysql索引机制了吗?
    面试之后,扼腕叹息。
    哎,这让人抠脑壳的 LFU。
    延迟消息的五种实现方案
    Java实现Kafka生产者和消费者的示例
    Pytorch训练时显存分配过程探究
    Python命令行参数定义及注意事项
  • 原文地址:https://www.cnblogs.com/lxshwyan/p/10788457.html
Copyright © 2020-2023  润新知