C# Windows桌面应用自动更新程序,无需大修改主程序,只需加一点启动更新程序的代码即可

桌面应用更新程序
启动时,根据主程序本地的版本文件(LocalVersion.xml),拿到远程更新地址,比较远程配置的版本文件(ServerVersion.xml)
如果有新版本,则判断更新程序是否位于系统盘,且是否为管理员身份运行
如果位于系统盘,且不是管理员身份运行,则重新以管理员身份运行更新重启,操作系统会弹出账号控制提示给客户
如果不是则打开主窗体,提示有新版本可以更新,是否下载更新
(这个机制可以达到无论客户把程序装在系统盘还是其他盘都不会影响更新操作,并且如果客户不是装在系统盘,还可以免去每次检查更新系统都弹出"权限控制"的提示给客户)
下载更新完成后,会自动删除下载的更新包,并且重新启动主程序

在主程序启动时,同时启动更新程序,即可检查更新了,如果客户选中暂时不更新,下次打开还是会提示更新,如果想跳过该版本,那就得在取消的时候做点操作
把远程最新版本号,修改到主程序本地的版本文件(LocalVersion.xml)

底部有代码百度网盘下载地址

首先更新程序的入口做运行身份检查

static class Program
    {       
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            var temp = Update.HasNewVersion();
            if (Convert.ToBoolean(temp.result))
            {
                if (Update.IsSystemPath() && ! Update.IsAdministrator())
                {
                    Update.ReStartAppWithAdministrator();                  
                }
                else
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Application.Run(new Form1(temp));
                }                
            }
            else
            {
                Environment.Exit(0);
            }            
        }
    }

然后是使用WebClient进行文件下载

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Security.Principal;

namespace UpdateApp
{
    public class Update
    {
        WebClient _client;
        public Update()
        {
            _client = new WebClient();
            _client.DownloadFileCompleted += (sender, args) => { DownloadFileCompleted?.Invoke(sender, args); };
            _client.DownloadProgressChanged += (sender, args) => { DownloadProgressChanged?.Invoke(sender, args); };
        }
        /// <summary>
        /// 在异步文件下载操作完成时发生。
        /// </summary>
        public Action<object, AsyncCompletedEventArgs> DownloadFileCompleted { get; set; }
        /// <summary>
        /// 在异步下载操作成功转换部分或全部数据后发生
        /// </summary>
        public Action<object, DownloadProgressChangedEventArgs> DownloadProgressChanged { get; set; }
        /// <summary>
        /// 根据名字 关闭进程
        /// </summary>
        /// <param name="ProcessName"></param>
        /// <returns></returns>
        public static bool CloseProcess(string ProcessName)
        {
            bool result = false;
            var temp = System.Diagnostics.Process.GetProcessesByName(ProcessName);
            foreach (var item in temp)
            {
                try
                {
                    item.Kill();
                    result = true;
                }
                catch
                {
                }
            }
            return result;
        }

        /// <summary>
        /// 检查是否有新版本
        /// </summary>
        /// <returns></returns>
        public static dynamic HasNewVersion()
        {
            try
            {
                var appPath = Directory.GetParent(Application.StartupPath).FullName;
                XElement localxdoc = XElement.Load(appPath + "\\LocalVersion.xml");
                var localV = localxdoc.Element("version").Value;
                var localU = localxdoc.Element("url").Value;
                //应用程序名称
                var localAppName = localxdoc.Element("appName").Value;
                //更新过程必须关掉的进程列表
                var localKillList = localxdoc.Element("killList").Value;

                XElement serverxdoc = XElement.Load(localU);
                //服务端版本
                var serverV = serverxdoc.Element("version").Value;
                //更新包地址
                var serverU = serverxdoc.Element("url").Value;
                //是否必须更新
                var serverRU = serverxdoc.Element("requiredUpdate").Value;

                var temp2 = Convert.ToInt32(serverV.Replace(".", ""));
                var temp3 = Convert.ToInt32(localV.Replace(".", ""));

                return new
                {
                    result = temp2 > temp3,
                    url = serverU,
                    appName = localAppName,
                    packName = Path.GetFileNameWithoutExtension(serverU),
                    killList = localKillList,
                    requiredUpdate = serverRU
                };
            }
            catch {
                return new { result = false };
            }                      
        }
        /// <summary>
        /// 异步下载文件
        /// </
一、软件开发环境以及开发工具: 框架:.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下来用);
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值