You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改ClickOnce WPF C#应用的更新提示框并添加详情?

自定义ClickOnce更新提示的可行方案

当然可以替换默认的ClickOnce更新提示!默认的提示确实太简洁了,没法传递版本细节和更新说明,不过我们可以通过禁用默认更新检查+手动实现更新逻辑的方式,完全自定义提示内容。下面是具体步骤:

第一步:关闭默认的自动更新检查

首先得把ClickOnce自带的自动检查给关掉,避免和我们的自定义逻辑冲突:

  • 打开你的WPF项目属性,切换到「发布」选项卡
  • 点击「更新」按钮,取消勾选「应用程序启动时检查更新」
  • 保存设置,这样默认的提示就不会再弹出来了

第二步:手动实现更新检查逻辑

我们需要用System.Deployment.Application命名空间下的API来手动检查更新,这个API只有在ClickOnce部署的应用中才能正常工作,所以记得先做判断。

核心代码示例

using System.Deployment.Application;
using System.Windows;

private async void CheckForUpdatesManually()
{
    // 先判断是否是ClickOnce部署的应用
    if (!ApplicationDeployment.IsNetworkDeployed)
    {
        MessageBox.Show("此应用未通过ClickOnce部署,无法检查更新。");
        return;
    }

    try
    {
        var deployment = ApplicationDeployment.CurrentDeployment;
        // 异步检查更新,避免阻塞UI
        var updateInfo = await deployment.CheckForUpdateAsync();

        if (updateInfo.UpdateAvailable)
        {
            // 获取版本对比信息
            var newVersion = updateInfo.AvailableVersion.ToString();
            var currentVersion = deployment.CurrentVersion.ToString();

            // 加载更新说明(这里可以替换成你自己的获取逻辑)
            var releaseNotes = await GetReleaseNotesAsync(newVersion);

            // 弹出自定义更新提示窗口
            var updateWindow = new UpdatePromptWindow(
                currentVersion,
                newVersion,
                releaseNotes
            );
            
            if (updateWindow.ShowDialog() == true)
            {
                // 用户确认更新,开始下载并安装
                await deployment.UpdateAsync();
                MessageBox.Show("更新已完成,请重启应用。");
                Application.Current.Shutdown();
            }
        }
        else
        {
            MessageBox.Show("当前已是最新版本。");
        }
    }
    catch (DeploymentDownloadException ex)
    {
        MessageBox.Show($"更新检查失败:{ex.Message}");
    }
    catch (InvalidDeploymentException)
    {
        MessageBox.Show("部署信息无效,无法检查更新。");
    }
}

第三步:获取自定义更新说明的几种方式

要在提示里显示更新缘由、版本细节,你需要把这些信息和新版本一起发布,这里提供两种常用方法:

方法1:发布独立的更新说明文件

  • 在你的项目中添加一个ReleaseNotes_{版本号}.txt(比如ReleaseNotes_1.2.0.txt),或者统一用LatestReleaseNotes.txt每次发布时覆盖
  • 设置文件的「复制到输出目录」为「始终复制」,并在发布选项卡中确保这个文件被包含在发布内容里
  • 然后通过下面的方法读取文件内容:
private async Task<string> GetReleaseNotesAsync(string newVersion)
{
    var deployment = ApplicationDeployment.CurrentDeployment;
    // 指向发布服务器上的更新说明文件路径(和应用部署包同目录)
    var notesUrl = new Uri($"{deployment.UpdateLocation.AbsoluteUri}ReleaseNotes_{newVersion}.txt");
    
    using var client = new HttpClient();
    var notesContent = await client.GetStringAsync(notesUrl);
    return notesContent;
}

方法2:在应用清单中嵌入更新信息

  • 打开项目的app.manifest文件,在<assembly>节点下添加自定义元数据:
<assembly ...>
  <assemblyIdentity ... />
  <!-- 自定义更新信息 -->
  <customAttributes xmlns="urn:schemas-microsoft-com:asm.v3">
    <customAttribute>
      <attributeName>ReleaseNotes</attributeName>
      <attributeValue>1.2.0版本更新内容:
- 修复了导出功能的Bug
- 新增了用户偏好设置
- 优化了界面加载速度</attributeValue>
    </customAttribute>
  </customAttributes>
</assembly>
  • 然后通过代码读取这个元数据:
private string GetReleaseNotesFromManifest()
{
    var deployment = ApplicationDeployment.CurrentDeployment;
    var manifest = deployment.GetManifestAsync().Result;
    var customAttributes = manifest.Assembly.Cast<object>()
        .OfType<CustomAttribute>()
        .FirstOrDefault(ca => ca.Name == "ReleaseNotes");
    
    return customAttributes?.Value ?? "暂无更新说明";
}

第四步:创建自定义更新提示窗口

你可以用WPF设计一个和应用风格一致的窗口,包含以下元素:

  • 当前版本和新版本号的对比展示
  • 滚动显示的更新说明文本框
    -「立即更新」和「稍后提醒」按钮

这样用户就能清晰看到更新的所有细节,再决定是否更新。

注意事项

  • 记得在项目中引用System.Deployment程序集,否则无法使用ApplicationDeployment类
  • 处理好网络异常情况,比如用户离线时的友好提示
  • 如果你的应用需要后台静默检查更新,可以把检查逻辑放在应用启动后的后台线程里,不要阻塞UI

内容的提问来源于stack exchange,提问作者NirMH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:32:44