.NET 桌面应用 (WPF/WinForm) 高效自动更新解决方案

206 阅读4分钟

前言

在软件开发中,应用程序的自动更新功能已成为提升用户体验和维护效率的重要组成部分。为了帮助开发快速集成自动升级能力,推荐一款专为 WPF/WinForm 应用程序设计的轻量级自动更新组件,具备良好的兼容性和易用性,适用于多种 .NET 项目环境。

项目介绍

LingYanAutoUpdateServer 是一个基于 .NET 框架开发的自动更新程序,主要面向 WPF 应用场景。该组件提供了一套完整的自动更新逻辑处理机制与可视化界面,支持检查版本、下载更新包以及执行热替换操作,极大简化了开发实现自动升级功能的工作量。

项目功能

  • 支持配置窗体标题与更新提示信息

  • 可设置升级压缩包的远程下载地址

  • 支持本地与服务器版本号对比

  • 提供存放最新版本信息的文本路径配置

  • 图形化展示更新过程

  • 支持 .NET Framework 与 .NET Core 项目

  • 提供 NuGet 包管理方式及手动集成方案

项目特点

  1. 轻量级设计,资源占用低,适合各类桌面应用集成

  2. 提供图形界面,用户更新体验友好

  3. 支持主流 .NET 平台,包括 .NET Framework 和 .NET Core

  4. 集成简单,通过 NuGet 安装或手动复制即可使用

  5. 开放源码,便于定制扩展,满足多样化需求

项目技术

项目采用 .NET 技术栈开发,结合 WPF 实现界面交互,整体架构清晰稳定:

  • 核心逻辑库:负责版本比对、文件下载与更新执行

  • 界面模块:WPF 构建的图形化更新进度展示

  • 依赖管理:支持通过 NuGet 包安装或手动集成

  • 运行环境:.NET Framework / .NET Core

  • 第三方工具:NuGet 包源地址为 nuget.lingyanspace.com/v3/index.js…

项目使用

1、配置自动更新信息

// 参数1:窗体标题
// 参数2:升级压缩包的URL
// 参数3:存放最新版本号的文件路径
// 参数4:本地版本号
// 参数5:服务器上的版本号
LingYanAutoUpdateManager.Setting("测试升级", updateURL, "my.txt", "1.0", "2.0");

2、当需要检查并执行更新时调用

LingYanAutoUpdateManager.ToRun();

项目源码

项目框架及源码展示,具体如下图所示

public MainViewModel()
{
    this.DownloadModelInter = new DownloadModel();
    this.ExtractModelInter = new ExtractModel();
    this.LocalVersion = App.AutoUpdateModel?.LocalVersion??"0.0";
    this.ServerVersion = App.AutoUpdateModel?.ServerVersion??"0.1";
    this.WindowTitle = App.AutoUpdateModel?.TitleName ?? "云端在线升级";
    this.CurrentDecription = "等待更新...";
    ViewInitEndAction(async () =>
    {
        await ToDownloadCommandMethod();
    });
}
public void ViewInitEndAction(Action action, double time = 0.3)
{
    DispatcherTimer startTimer = new DispatcherTimer(DispatcherPriority.Normal);
    startTimer.Interval = TimeSpan.FromSeconds(0.3); // 设置定时器间隔,这里设置为1秒
    startTimer.Tick += (sender, e) =>
    {
        startTimer.Stop();
        action.Invoke();
    };
    startTimer.Start();
}
private async Task ToDownloadCommandMethod()
{
    try
    {
        Application.Current.Dispatcher.Invoke(() => this.CurrentDecription = "下载升级包...");
        var downloadAction = new Action<double, double, double, double>((t1, t2, t3, t4) =>
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                this.DownloadModelInter.CuurentProgress = t1;
                this.DownloadModelInter.HasDownloadValue = t2;
                this.DownloadModelInter.TotalDownloadValue = t3;
                this.DownloadModelInter.DownloadSpeed = t4;
            });
        });
        var localUrl = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, App.AutoUpdateModel.UpdatePackageZipUrl.Split('/').LastOrDefault());
        var downloadReuslt = await AutoUpdateHelper.DownloadSingleFile(downloadAction, App.AutoUpdateModel.UpdatePackageZipUrl, localUrl);
        Application.Current.Dispatcher.Invoke(() => this.CurrentDecription = "解压升级包...");
        var extractUpdateZip = new Action<string, int, int, double>((str, i1, i2, d) =>
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                this.ExtractModelInter.CurrentFileName = str;
                this.ExtractModelInter.CurrentFileIndex = i1;
                this.ExtractModelInter.CurrentExtractProgress = d;
                this.ExtractModelInter.TotalFiles = i2;
            });
        });
        var descrptionAction = new Action<string>((str) =>
        {
            Application.Current.Dispatcher.Invoke(() => this.CurrentDecription = str);
        });
        await Task.Run(async () =>
        {
            await AutoUpdateHelper.UpdateMainApp(extractUpdateZip, descrptionAction, App.AutoUpdateModel.RestartApp, localUrl, App.AutoUpdateModel.LocalVersionDir, App.AutoUpdateModel.ServerVersion);
        });
        // 升级成功通知
        ToastNotification.Show("升级成功", "通知", true);
        Application.Current.Dispatcher.Invoke(() =>
        {
            Application.Current.MainWindow?.Close();
        });
    }
    catch (Exception ex)
    {
        // 升级失败通知
        ToastNotification.Show("升级失败", "通知", false);
    }
    finally
    {
        //Environment.Exit(0);
    }
}

项目效果

集成 LingYanAutoUpdateServer 后,应用程序可在启动时自动检测新版本,并在用户确认后完成无缝更新。图形界面直观显示下载进度与更新状态,有效减少用户等待焦虑,同时提升了软件维护的自动化水平,降低了版本管理成本。

项目源码

Gitee:gitee.com/www-lingyan…

总结

LingYanAutoUpdateServer 凭借其简洁的设计理念与强大的功能性,为 WPF 应用提供了高效稳定的自动更新解决方案。无论是企业内部系统还是面向公众的桌面应用,都能从中受益。未来将持续优化更新流程,增强安全性与兼容性,助力更多开发者轻松实现应用自更新。

关键词:自动更新、WPF、.NET、LingYanAutoUpdateServer、开源、NuGet、版本管理、图形界面、更新服务器、桌面应用

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!