开发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. Mad libs

    Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type &q ...

  2. CentOS7基本配置一

    CentOS7基本配置一 安装VMwareTools 1.点击重新安装VM-tool, 继而找到压缩文件VMwareTools-10.2.0...tar.gz,复制到桌面下,解压这么压缩文件到桌面下 ...

  3. JS之代理模式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 怎样将virtualbox中的虚拟系统安装到c盘以外的盘

    首先在安装的时候是可以选择虚拟机文件的位置的,如果当时没注意,只能现在移动一下了,很简单 首先将 C:/Users目录下的.VirtualBox和VirtualBox VMs两个文件拷贝到你愿意放的位 ...

  5. Window下,利用Anaconda2创建jupyter-notebook的python3环境方法

    随着深度学习的火热,越来越多的人去学习和了解这门技术.而做算法的同学为了能够更快,更高效的写出相关的深度学习算法出来,需要比较方便的开发环境.今天主要介绍一下在jupyter notebook中,新增 ...

  6. 搭建webpack基础配置

    搭建webpack基础步骤: 1.去官方网站下载node.js(根据自己电脑的系统类型选择) 2.安装node.js完成后打开cmd命令提示符: 出现版本号证明安装成功 3.cd到工程目录下 npm ...

  7. 【转】用opencv使摄像头在30fps下捕获1080p的数据

    原文:http://blog.sina.com.cn/s/blog_9b493e7b0102xvn6.html opencv可以捕获摄像头数据.如果要读高分辨率和高帧率,可以用如下的设置: captu ...

  8. Java的命名规范

    1.类名.接口名:首单词的第一个字母要大写.如果有多个单词,其他单词的首字母要大写. 2.包名:全部小写. 3.变量名.方法名:首单词的第一个字母小写.如果有多个单词,其他单词的首字母要大写. 4.常 ...

  9. java面向对象编程(九)--final

    1.final概念 final可以修饰变量或者方法.在某些情况下,程序员可能有以下需求: a.当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰. b.当不希望类的某个 ...

  10. 2019-04-22-day037-数据库的安装

    内容回顾 进程 线程 协程之间的相同点和不同点 进程 : 内存隔离 操作系统级别 开销大 可以利用多核 计算机中资源分配的最小单位 线程 : 内存共享 操作系统级别 开销中 Cpython解释器下不能 ...