Winform小工具的自动更新功能实现

本文介绍了如何在Winform小工具中实现自动更新功能,利用FTP存储包名和版本信息,通过程序运行时获取进程ID,对比版本并执行下载、替换、重启的流程,使用批处理命令进行操作。


前言

自制的Winform小工具,不到1MB,局域网内多人使用。
在功能更新/修复bug时,如果挨个发新包,显得过于愚蠢。
所以制作了自动更新功能。
说白了就是自动执行【下载最新版,替换,打开】这套流程。

注意:大概率是取巧方式,只是凑巧能用


一、思路

  • 1、程序发布时,
    • 1.1、包名和版本号就已经确定了(写在代码里-_-||)。
    • 1.2、上传到更新服务器中,我这里用的是FTP,然后用TXT记录包名和对应的最新版本号。
  • 2、程序运行,
    • 2.1、获取当前程序进程id,用于后续更新时KILL。
    • 2.2、去FTP下载TXT,比对版本。
  • 3、点击更新,
    • 3.1、下载最新的EXE到TEMP,Path.GetTempFileName()
    • 3.2、运行cmd,执行:关闭自己,移动并覆盖文件,重新打开。
  • 完成更新。

之所以这么做,主要的一点,小工具的发布模式是单个文件
常理来说,应该是另外有个update.exe,需要更新时去启动它。
我这里相当于用cmd.exe 代替了update.exe的工作。

二、功能实现

&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面
&&,表示必须前一个命令执行成功才会执行后面的命令
||,表示必须前一个命令执行失败才会执行后面的命令
|,表示前一个命令输出结果作为后一个命令的参数使用
/C,执行字符串指定的命令,然后终止

string[] cmds = new string[]
{
    $"taskkill /pid {processId} /f&&",// /f 指定强制结束进程。成功继续
    $"timeout /t 2&",//等个2秒
    $"tasklist | findstr \"{processId}\"||",//找不到才继续
    $"move /y {sourcesFileName} {destFileName}&&",// /y 不提示覆盖。成功继续
    $"start {destFileName}&",
    $"timeout /t 3",//等个3秒,然后结束
};

Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = @$"/C {string.Join("", cmds)}";
p.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
p.StartInfo.CreateNoWindow = false;//显示程序窗口
p.Start();//启动程序
一、软件开发环境以及开发工具: 框架:.NET Framework 4.0 工具:Visual Studio 2017 插件:DevExpress 18.1.7 环境:IIS 7 二、实现步骤 (1)在项目中创建一个名为WinformAutoUpdate.APP的Winform窗体应用工程,并将默认的Form1.cs窗体文件重命名为MainFrm.cs作为主程序窗体 创建主程序窗体 (2)在项目中再创建一个名为AutoUpdateTask的Winform应用程序工程,并将默认的Form1.cs窗体文件重命名为AutoUpdateTaskFrm.cs作为更新程序窗体 创建更新程序窗体 (3)在更新程序窗体中放入图上所示的相关控件; 进度条控件用于显示更新进度,放入一个Button按钮控件用于用户根据提示进行操作! 实现思路: 1、将更新程序放入磁盘的目录下面,并将其放在已经发布了的IIS中 当用户在运行主程序窗体并点击左上角的更新按钮时,弹出程序更新窗体,并先自动从IIS中拉取updateList.xml文件,然后与本地程序作对比,检测是否需要升级软件; 如果有新版本发布,则点击“立即更新”按钮,程序将从IIS中拉取新发布的ZIP软件包,并自动解压到主程序目录中,覆盖主程序目录中的相关文件(这里值得注意的是,在解压程序之前,我们需要先结束主程序的进程,不然会因主程序进程正在使用而导致报错,另外,我们用到的插件是ICSharpCode.SharpZipLib.dll第三方动态链接库,网上有现成的,可以直接Down下来用);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值