开发WINDOWS应用程序一般都会有一个自动更新的功能,这就需要提供一个单独的更新程序来更新主程序,那么主程序怎么检测是否有更新,以及更新程序怎么去更新主程序呢?下面将分开研究分析。

用VS发布向导发布的都是安装程序,每次更细都是将整个安装程序下载下来重新安装,有时候安装程序过大而更新又比较平凡(比如我们ERP系统中经常有模块需要升级),为了升级一个单独的模块而升级整个应用程序,这将严重影响用户体验。于是我们采用下载远程模块DLL的方式,客户端用XML文件来保存版本信息,服务器的版本信息保存在数据库中。用户每次运行客户端主程序时,就去检测客户端的版本和服务器端的版本是否一致,不一致的话,就要启动更新程序进行模块更新。这里解释一下为什么要用更新程序去更新主程序,因为我们首先运行的是主程序,主程序在运行过程中是不能更新自己的,因为主程序文件正在使用,不能被远程下载下来的文件覆盖,所以不能在主程序中写更新代码逻辑来更新自己。那怎么解决这个问题呢,这里有一个小技巧,我们在主程序路口点这样处理一下:

using System;  
using System.Collections.Generic;  
using System.Windows.Forms;  
  
  
using MainForm;//主程序窗体所在的DLL  
using System.Diagnostics;  
  
namespace WindowsApplication1  
{  
    static class Program  
    {  
        /// <summary>  
        /// 应用程序的主入口点。  
        /// </summary>  
        [STAThread]  
        static void Main(string[] args)//注意我入口点加了参数,正常创建应用程序时这里是Main()不带参数的  
        {  
             //检测主程序是否是由更新程序启动的  
            if (args.Length >  && args[] == "Updated")  
            {  
//如果是,则运行主程序  
                Application.EnableVisualStyles();  
                Application.SetCompatibleTextRenderingDefault(false);  
      
  
                Application.Run(new XtraForm3());//XtraForm3是主程序窗体  
  
            }  
            else  
            {  
//如果不是,则先运行更新程序检查是否需要更新  
                Process process = new Process();  
                process.StartInfo.FileName = Application.StartupPath + "//YeXin2.0Update.exe";//更新程序所在位置  
                process.Start();//启动更新程序  
                Application.Exit();//关闭主程序  
            }  
              
        }  
    }  
}  

,我们看到,如果不是由更新程序启动的主程序(更新程序如何启动主程序下面介绍),则会启动更新程序,然后关闭自己,让更新程序来更新主程序或者运行主程序。这样主程序就不在运行中,可以下载服务器的主程序DLL来覆盖本地的主程序DLL实现更新主程序的目的。

更新程序的逻辑网上应该有很多,我简单阐述下我的逻辑,版本文件有一个总版本号,然后才是各个模块的自己的版本号。如果总版本号一致,则说明当前是最新程序,不去检查各个模块的版本号,反之,才会去检查各个模块的版本号判断是否需要更新模块。

更新成功后,我们需要同步本地文件的版本信息已经模块DLL并启动主程序。更新成功后我们可以这样写:

CopyFilesDirs(basesavepath, Application.StartupPath);//将下载下来的文件覆盖本地的文件  
  
       Directory.Delete(basesavepath, true);//删除本地临时文件夹  
  
       UpdateVersionFile();//更新本地版本文件信息  
  
       if (MessageBox.Show("更新成功!启动ERP程序吗?", "更新提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)  
       {  
  
           if (File.Exists(Application.StartupPath + "//YeXinERP2WinForm.exe"))  
           {  
  
               Process process = new Process();  
               process.StartInfo.FileName = Application.StartupPath + "//YeXinERP2WinForm.exe";  
               process.StartInfo.Arguments = "Updated";//传递启动参数,这里是重点,主程序入口点需要判断这个参数来判断是否是由更新程序启动的  
               process.Start();  
  
  
           }  
           else  
           {  
               MessageBox.Show("没有找到ERP运行程序!");  
           }  
       }  

这里我是将服务器上下载下来的需要更新的文件保存在一个临时文件夹下面,而不是边下载边覆盖的形式,等全部下载完之后再覆盖本地文件,删除临时文件夹。为什么这样处理呢?因为有时候在下载过程中可能会终止下载(用户点取消下载按钮终止或者非正常终止比如直接KILL更新程序的进程等等),如果采用下载直接写本地文件的方式的话,可能会把本地文件破坏(一个1M的DLL文件,下载到一半的时候中断更新程序,此DLL文件就被破坏了)。

一般情况下更新程序做好之后都不会有什么改动,所以不需要更新自己,那么我非要更新自己,该怎么解决呢?那只能把更新程序做成安装程序了。用更新程序下载更新安装程序,下载完后关闭更新程序,运行更新安装程序更新自己。

以上是从网上找来的思路,它是启动主程序,然后再启动更新程序,再启动主程序进入程序。既然这样,那么我想,我也可以:直接每次启动更新程序进入主程序,这样做,可以把主程序和更新程序完全分开,以达到更新程序的直接复用。

在更新程序中:

1.可以插入计时器来查看数据库是否可以连接上,以实现可以连上数据库时,自动连上。

2.更新程序。更新完成,启动主程序。

出处:https://blog.csdn.net/spw55381155/article/details/79894055

WinForm关于更新程序的设计思路的更多相关文章

  1. 【WPF】软件更新程序的设计思路

    目标:客户端程序在启动时,自动联网检查服务端是否有新的版本,有则提示用户更新客户端. 思路: 1.打开Visual Studio,在主体程序的解决方案下再新建一个叫自动更新程序的项目.主体程序的目录是 ...

  2. winform自动更新程序实现

    一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感 ...

  3. WinForm窗体更新程序

    流程介绍: 打包参阅:WinForm程序打包说明    图一    图二    图三   实现步骤: 主程序 1.检测是否连上ftp服务器 1.1 连接不上,不检测. 1.2 连接上,如果有更新进程, ...

  4. Laravel 程序架构设计思路:使用动作类

    当我们谈论到应用程序的架构的时候,经常会问到一个经典的问题,那就是"这段代码应该放在哪里比较好". 因为 Laravel 是一个相当灵活的框架,所以要回答这个问题其实没那么容易.我 ...

  5. 分享一个客户端程序(winform)自动升级程序,思路+说明+源码

    做winform的程序,不管用没用过自动更新,至少都想过自动更新是怎么实现的. 我这里共享一个自动更新的一套版本,给还没下手开始写的人一些帮助,也希望有大神来到,给指点优化意见. 本初我是通过sock ...

  6. windows程序消息机制(Winform界面更新有关)

    windows程序消息机制(Winform界面更新有关) 转自:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html 1. Win ...

  7. HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo

    26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...

  8. C# WINFORM的自动更新程序

    自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...

  9. winform 通用自动更新程序

    通用自动更新程序 主要功能: 1. 可用于 C/S 程序的更新,集成到宿主主程序非常简单和配置非常简单,或不集成到主程序独立运行. 2. 支持 HTTP.FTP.WebService等多种更新下载方式 ...

随机推荐

  1. impala和kudu使用的小细节

    七堇年:我们要有最朴素的生活与最遥远的梦想 . 即使明日天寒地冻,路远马亡.   加油! 之前入门的小错误总结,建表都会出错,真的好尴尬 还是要做好笔记 第一个错误: error:AnalysisEx ...

  2. shell练习题5

    需求如下: 用shell实现,把一个文件文档中只有一个数字的行给打印出来.(以/password文件为例,自行修改) 参考解答如下 方法1 #!/bin/bash file_name=passwd n ...

  3. bootstrap-fileinput视频上传

    在页面编写一个input框: <input id="input-repl-3a" name="videoFileAddress" type="f ...

  4. react-native-scrollable-tab-view 中嵌套了react-native-swiper产生的bug

    前段时间用RN的时候遇到过这个问题用scrollable-tab-view(scrollableView)这个组件然后嵌套轮播swiper会出现,在scrollableView  nitialPage ...

  5. aqua data studio 连接db2

    打开datastudio 右键本地数据库服务器 →注册服务器打开以下界面: 1:选择版本号(我这里是window 9.7版本的db2) 2:名称 按照需要的写 3.登录名/密码 4.ip port 数 ...

  6. JAVA作业三

    (一)学习总结 1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Gr ...

  7. 转:vim模式下报错E37: No write since last change (add ! to override)

    故障现象: 使用vim修改文件报错,系统提示如下: E37: No write since last change (add ! to override) 故障原因: 文件为只读文件,无法修改. 解决 ...

  8. sql注入练习,sqli-labs writeup

    一.Less-1 1.判断是否存在注入 URL中输入“?id=1”,发现回显有变化,说明存在注入: 2.判断闭合字符,注释后面的内容 输入“   ?id=1'  ”,回显为  "1" ...

  9. 如何才能在python的路上走得更远

    刚开始了新的课程,现在又没有什么心情学习了,不知点解就是提不起兴趣去学习,为什么呢?学习python如何才能提起劲,有什么方法可以提上劲学习?

  10. yii2下载

    我发现yii2下载贼困难,不过折腾了很久终于搞下来了. 一,设置镜像 安装composer ,   下载 composer.phar 添加中国镜像   composer config -g repo. ...