Winform程序自动更新,从服务器下载更新文件到本地

2018-09-21 基于C#的本地服务器和客服端 基于C#的本地服务器和客服端 下面来实现本地的服务器 首先创建一个服务器项目 1. 代码如下 先引用类库 using System.Net; using System.Net.Sockets; 在main中实现调用 static void Main(string[] args) ... 阅读详情

背景:

假如已经开发好了一个管理系统,如OverseaPMS.exe,现在有个需求,希望以后程序有变更时,客户端可以检测到,然后从服务器更新高版本程序到本地,而不用开发人员打包setup.exe发给用户覆盖安装。

思路:

打开程序OverseaPMS.exe后,分别读取本地配置文件SystemConfig.xml和服务器配置文件ServerUpdate.xml(一般是在登录界面读取配置文件,如果没有就在主程序界面),从本地配置文件中读取客户端版本号ClientVersion,将其与服务器上的版本号ServerVersion比较。如果ClientVersion小于ServerVersion,就调用更新程序AutoUpdate.exe进行更新,否则就继续运行本地程序OverseaPMS.exe。

具体实施:

(1)客户端程序:

1. OverseaPMS.exe程序代码,内部设置检测机制,思路如上文。

注:检查更新通过异步实现:BackgroundWorker。

// 开始执行后台操作(耗时操作)

this.backgroundUpdate.RunWorkerAsync();//触发backgroundUpadate_DoWork方法执行

在App.config中配置 <!--更新路径-->
<add key="UpdatePath" value="http://localhost:8090/Update_OverseaPMS"  />

#region 检查更新
        /// <summary>
        /// 检测更新,检测MAC地址
        /// </summary>
        private void backgroundUpadate_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                e.Result = false;
                string localxmlPath = System.Windows.Forms.Application.StartupPath + "\\SystemConfig.xml";//ClientUpdate.xml
                //string ct = System.Windows.Forms.Application.StartupPath + "\\setup.exe";//OverseaPMS.exe
                string serverpath = basePath + "/ServerUpdate.xml";//basePath为更新路径,在App.config中配置
                System.Xml.XmlDocument dc = new XmlDocument();
                dc.Load(localxmlPath);
                string clientVer = dc.SelectSingleNode("/SystemConfig/ClientUpdate/Version").InnerText;
                double cv = Convert.ToDouble(clientVer);

                System.Xml.XmlDocument dc1 = new XmlDocument();
                dc1.Load(serverpath);//
                string serVer = dc1.SelectSingleNode("/ServerUpdate/Version").InnerText;
                double sv = Convert.ToDouble(serVer);

                //  MessageBox.Show("获取版本号!");
                if (cv < sv)
                {
                    e.Result = true;
                    return;
                }

                else
                {
                    //MessageBox.Show("当前版本为最新!");
                    e.Result = false;
                    return;
                }
            }
            catch (FileNotFoundException fx)
            {
                MessageBox.Show("找不到客户端版本更新文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (System.Exception ex)
            {
                Utility.Log.WriteSysLog("Main," + MethodBase.GetCurrentMethod().Name, ex);
                MessageBox.Show("网络连接异常或操作不成功,请重试或与管理员联系!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

        private void backgroundUpadate_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if ((bool)e.Result)
                {
                    // return;  //测试使用

                    if (MessageBox.Show("检测到有更高版本!是否进行更新", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {

                        //MessageBox.Show("Completed!");
                        System.Diagnostics.Process.Start(Application.StartupPath + "\\Update\\AutoUpdate.exe", Application.StartupPath.Replace(' ', '|'));
                        System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
                        foreach (System.Diagnostics.Process p in ps)
                        {

                            if (p.ProcessName.ToLower() == "overseapms" || p.ProcessName.ToLower() == "overseapms.vshost")
                            {
                                //MessageBox.Show(p.ProcessName);
                                p.Kill();
                                break;
                            }
                        }
                    }
                }

            }
            catch (System.Exception ex)
            {
                Utility.Log.WriteSysLog("Main," + MethodBase.GetCurrentMethod().Name, ex);

                MessageBox.Show("网络连接异常或操作不成功,请重试或与管理员联系!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        #endregion

2. 开发自动更新程序AutoUpdate.exe,供OverseaPMS.exe调用。

更正:

(2)服务器:

1. 新建一个文件夹Update,存放要更新的文件如高版本的.exe程序,.dll,ServerUpdate.xml等。

2. 将文件夹Update拷贝至服务器。

如下图,我是在服务器桌面新建了一个test文件夹,并将Update文件夹拷贝进入了。


3. IIS添加网站,网站名可以随便填,目录指向test。

转:ASP.NET程序发布、IIS安装、在IIS上部署网站等


部署后注意:网站需要配置.config,否则客户端无法从服务器下载.exe.config文件,更新后的程序不能运行。



Winform程序自动更新 Winform程序自动更新我也是第一次做,网上找了自动更新的源码,后来又根据在网上看到的一些方法,自己试了很久,最终还是有写错误,所以花了钱让别人帮忙调试成功的,下面是我自己捣腾出来的,方便大家借鉴,如果有什么错误的地方欢迎指正. 1、由于我是通过服务器的IIS发布自动更新的,更新之前先手动把程序复制到IIS服务器的目录下面,做一些更改,客户端才能正常自动更新。所以第一步是不熟IIS服务器(本人 阅读详情

相关推荐

C#程序自动更新(Winfrom)

------------------------------Winfrom程序的自动更新,或者提示更新------------------------------------- 很多时候给用户提供程序的时候,在你自己增加功能,升级版本的时候,如果没有好的服务器和框架,就需要一直打包更新后的程序文件给到对方,以下方法可以避免这个问题,自己更新了之后所有的用户只要登录系统就可以自动更新 效果如下: 为了方便我们测试,在Windows系统的本机上新建一个...

m0_61451704的博客 5194

C# Winform自动更新

在Unity里面,有XLua,ILRuntime 这样的热更新框架,Unity和Winform不同之处是,Unity生成的项目,哪怕是Windows平台,根本不必关闭程序才能进行更新,但是Winform项目必须关闭程序才进行下载替换,在Winform平台目前还没看到什么好的开源框架,于是我自己动手写了一个效果如下:客户端自动更新方法大概如下面几条,最少需要做三个软件1.更新文件列表生成器2.软件启动器3.软件本体(只能由软件启动器 打开)软件启动入口可以加密码,防止用户随意打开我们知道,在原有基础上更新文件

熊思雨的博客 1万+

WinForm通用自动更新器AutoUpdater项目实战

一、项目背景介绍最近单位开发一个项目,其中需要用到自动升级功能。因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件,并添加少量代码,即可实现自动升级功能。因为我们的程序中可能包含多个类型的文件,比如exe、dll、 config、xml、bat等等自定义格式的后缀名文件,所以要支持多文件类型的更新。本期同样带给大家分...

跟着阿笨一起玩NET 2725

怎样用自己电脑搭建网络服务器!不花一分钱

当下,几乎每个人家中都有电脑,其实都可以用来搭建成网络服务器。今天小编就教大家怎样用自己电脑搭建网络服务器 !我们的目的是要能够在外网访问本地电脑的www目录,就像正常访问一个网站一样。下面说说具体该怎么做。 首先需要搭建好本地的服务器环境:1. 百度搜索并下载wampserver,建议安装wampserver2.5这个版本。WampServer是一款由法国人开发的Apache Web服务器、P...

4万+

C#实现自动更新之(独立的更新程序)

一、实现效果 二、实现思路 1、自动更新程序首先检查是否有客户端本地的更新包升级配置文件【如果没有则创建一份基础的本地客户端程序更新包升级配置文件】 2、自动更新程序获取服务器上的程序更新包升级配置文件【然后将客户端本地的更新包配置文件与服务器上下载来的升级配置文件的版本进行对比,如果服务器的版本大于客户端、或服务器的版本长度大于客户端则执行更新本地客户端的升级包配置文件和下载更新包操作】。 3、更新客户端程序的更新包升级配置文件; 4、下载服务器的更新包文件【当下载完成后校验该下载好的更新包

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 7282

C# WinForm应用程序的自动更新实现方法

本文还有配套的精品资源,点击获取 简介:自动更新功能对于软件开发者来说至关重要,它允许应用程序在无需用户手动操作的情况下升级到新版本。本文将深入探讨如何在基于C# WinForm的应用程序中实现自动更新。关键实现包括网络通信、使用XML或JSON文件存储更新信息、版本号比较、下载更新包管理、安全安装更新、权限管理、异常处理以及用户界面设计。这些知识点将通过解析源代码来深入理...

weixin_36431145的博客 2938

WinForm窗体更新程序

流程介绍: 打包参阅:WinForm程序打包说明 图一 图二 图三 实现步骤: 主程序 1、检测是否连上ftp服务器   1.1 连接不上,不检测。   1.2 连接上,如果有更新进程,关闭进程。 2、获取服务器上最新版本XML配置与本地比较   2.1 配置相同,走流程不更新,直接进入登录界面     见:流程介绍...

dingzhanban8543的博客 161

C# WinForm自动更新解决方案

本文还有配套的精品资源,点击获取 简介:C# WinForm应用开发中实现自动更新功能能够增强用户体验并确保软件安全性。本项目通过创建一个WinForm应用程序,展示自动更新机制的实现,包括版本检测、下载、解压和安装新版本。涉及到的关键组件有自动检测更新、异步下载处理、安全验证、以及用户体验优化等,提供了一个基础框架供开发者进一步定制和扩展。 1. WinForm应用...

weixin_36431814的博客 1344

winform应用程序更新 带进度条

winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,面对这个实际问题。 程序exe自己下载覆盖自己肯定是不行的,会报“当前程序正在被另一个进程所使用”的系统错误。因此我们需要做一个专门更新的程序来下载更新主程序以及其他相关文件。 在最近的一个小项目中,本人设计了一个通过软件实现自动升级技术方案,弥补了这一缺陷,有较好的参考价值 ...

weixin_33709609的博客 231

C# WinForm自动更新程序开发及实践DEMO展示

WinForm应用程序使用C#编写,属于.NET框架的一部分,它为开发者提供了丰富的控件集合,可用于构建丰富的桌面应用程序。WinForm的设计哲学侧重于直接的用户体验和快速开发,它允许开发者利用面向对象编程的能力,结合.NET框架的丰富类库,快速制作出功能强大的桌面应用程序。从按钮、文本框、列表框到复杂的数据绑定控件,WinForm框架几乎覆盖了所有标准UI控件的需求。

weixin_28872035的博客 1327

C# Winform应用程序自动更新解决方案实现

在 Winform 应用程序中,程序集的版本信息被存储在 AssemblyInfo.cs 文件中,这对于自动更新机制而言是非常关键的。版本信息不仅帮助识别应用程序的当前状态,而且还用于决定是否需要触发更新流程。更新版本信息通常包含四个部分:主版本号、次版本号、构建号和修订号。主版本号和次版本号的变更通常表示较大的更新,而构建号和修订号则可以表示日常的维护更新。更新这些信息通常需要以下步骤:打开 AssemblyInfo.cs 文件。修改和属性值。

weixin_35754962的博客 1601

基于FTP文件服务器实现C#桌面软件自动更新

本文介绍了基于FTP的自动更新系统实现方案。系统包含三个主要组件:1)文件上传管理器,用于将新版本文件上传至FTP服务器;2)更新程序,负责从服务器下载更新文件并显示进度;3)主程序,通过比对本地和服务器版本号决定是否启动更新。实现过程包括FTP连接配置、多文件批量上传下载、进度条显示等技术细节。系统采用C#开发,使用FTP协议进行文件传输,通过版本文件比对触发更新流程,实现了软件自动更新功能。

u012408847的博客 507

C#实现自动升级程序(含客户端和服务端)

程序分成UpdateServer(Web服务应用程序)和一个Client(命令行程序)。UpdateServer提供应用程序的最新版本,应用程序存放在UpdateServer下的AppCenter目录中。Client程序运行时,先从UpdateServer下载最新的版本,然后创建新的应用程序域加载程序执行。

C# 自动更新(基于FTP)

在去年,我写了一个 C# 版本的自动更新,这个是根据配置文件 + 网站文件等组成的框架,以实现本地文件的新增、替换和删除,虽然实现了自动更新的功能,但用起来过于复杂,代码量也比较大,改起来困难,后面我就想能不能弄一个 FTP 服务器进行版本的更新。

熊思雨的博客 1万+

C#_开发桌面自动更新程序(服务端与客户端)

C#_开发桌面自动更新程序(服务端与客户端),针对很多东西进行了解析,相当好的东西,值得参考!希望对你有用!

实现高精度卷积混响--MATLAB仿真篇

一、前言 之前在STM32F407上现实了直播声卡,实现的经典Schroeder混响模型和Moorer混响模型,得到不错效果。后来得知卷积混响最为真实地表现空间的特性,所以也就尝试在MCU上实现一个高精度的卷积混响(卷积点数为32768),目前MCU出来的混响效果算得上一流水准,本人也在计划在ADI的21489或者SC584上更高精度的卷积混响。 二、卷积方式 1、conv1是使用MATLAB自带卷积函数conv 2、conv2和conv3是改进后卷积过程,具有减少运算量特点,方便嵌入式移植 clear;

Six44的博客 5073

Winform 程序自动更新

一、WebService1.1 编写自动更新WebService 读服务器上关于程序各个版本信息的配置文件UpdateConfig.xml    [WebMethod]    public System.Xml.XmlDocument AppUpdateVertion()    {        System.Xml.XmlDocument xml = new System.Xml.Xml

Begin Again!~~~ 2967

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 408

WinForm程序自动更新:实现应用程序在线更新的利器

WinForm程序自动更新:实现应用程序在线更新的利器 去发现同类优质开源项目:https://gitcode.com/ WinForm程序自动更新,不超过30个字。 项目介绍 在现代软件开发领域,应用程序的自动更新功能已经成为提升用户体验的重要手段。WinForm程序自动更新正是为了满足这一需求而诞生的一个开源资源文件。它提供了一套完善的解决方案,使得WinForm应用程序能够轻松实现在线更新,...

gitblog_06756的博客 957

FPGA远程升级避坑指南:用AXI Quad SPI IP读写N25Q128 Flash的完整流程

本文详细介绍了FPGA远程升级过程中使用AXI Quad SPI IP读写N25Q128 Flash的完整流程,包括IP核配置、Flash操作指令集、双镜像备份设计及生产级远程升级协议。通过最佳实践和避坑策略,帮助开发者实现可靠的镜像更新方案,提升系统可靠性和可维护性。

weixin_30542079的博客 673

Telegram AI Bot自动化实战:5步用Make搭建业务工作台

Telegram Bot 是一种轻量级、高抵达率的消息自动化载体,其核心价值在于将结构化消息(如text、photo、callback_query)转化为可编程的事件流。基于 Bot API 的简洁设计与 Webhook 机制,开发者无需复杂鉴权即可实现毫秒级响应。结合低代码平台 Make,可快速构建具备上下文识别、条件路由、多系统分发与错误熔断能力的自动化流程。该方案特别适用于客服分发、数据同步、IoT告警等高频、规则明确、需即时反馈的业务场景,显著降低对 Python/Node.js 编程与 DevOp

weixin_33158887的博客 298

winform实现程序自动更新

程序启动端: string isAutoUpdate = ConfigurationManager.AppSettings["IsAutoUpdate"].ToString(); if (isAutoUpdate.Equals("True")) { string clientVersion = Configura...

Jakie_Zhan的博客 1131

1.3 重叠因子:希尔伯特变换趋势线(Hilbert Transform - Instantaneous Trendline)概念与Python实战

希尔伯特变换趋势线(Hilbert Transform - Instantaneous Trendline)是一种基于希尔伯特变换的高级技术分析工具。它使用数字信号处理技术来识别价格的主导周期,并生成一条平滑的趋势线。这种方法可以有效过滤市场噪音,提供更准确的趋势信号。

Kewin的博客 2084
上一篇: 错误:【Program,CurrentDomain_UnhandledException 错误:“Utility.SQLiteCreator”的类型初始值设定项引发异常。】
下一篇: Win7/Ubuntu16.04 LTS/ Ubuntu14.04 LTS安装配置Nginx
Claire0118
博客等级 码龄15年 52粉丝 81原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值