开发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. VGG网络结构

    这个结构其实不难,但是它里面训练的一些东西我还没有搞清楚,打算把昨天写的代码传上来,方便日后来看,发现了一个很有意思的库叫TF-slim打算哪天看看有没有好用的东西 from datetime imp ...

  2. jq解决a连接锚点平滑过渡

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. 下载MNIST数据集脚本input_data源码

    # Copyright 2015 Google Inc. All Rights Reserved.## Licensed under the Apache License, Version 2.0 ( ...

  4. linux下快速安装chrome

    linux下安装chrome 1.按下 Ctrl + Alt + t 键盘组合键,启动终端 2.在终端中,输入以下命令: (将下载源加入到系统的源列表.命令的反馈结果如图.如果返回“地址解析错误”等信 ...

  5. <iframe> 标签 中 src 的三种形式. display , echart

    1.形式一: <iframe scrolling="yes" src="action.php?c=HLogin&a=linkPage&p=fx&qu ...

  6. (原创)列主元Gauss消去法的通用程序

    import numpy as np np.set_printoptions(precision=5) A = np.array([[31., -13., 0., 0., 0., -10., 0., ...

  7. PHP 基于pdo的数据库操作类

    http://www.php.cn/php-weizijiaocheng-404645.html <?php class Pdodb{   protected $pdo;   protected ...

  8. golang 实现文件传输小demo

    获取文件信息需要用到os. Stat接口,发送文件前开启接收者(服务端),启动客户端先发送文件名给接收者,接收者收到文件名返回确认信息"ok",才读取本地文件 发送给接收者. 发送 ...

  9. 访问mysql出现Access denied for user 'root'@'的解决方法

    1.关闭mysql的服务 方法一:我的电脑右键-管理-服务和应用程序-服务,找到mysql,右键关闭 方法二:cmd进入命令提示符,service mysqld stop(这个是网上的方法,我试了一下 ...

  10. 关于null的判断

    Java中[null]的判断: 1.[null]只能通过is null,is not null判断,任何与的 关系运算(比较,有大于.大于等于.小于.小于等于.等于.不等于六种运算)都是false. ...