热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决ClickOnce部署时自动更新功能失效的问题

本文探讨了在使用ClickOnce部署方式时遇到的自动更新失败问题,包括本地安装与服务器安装的不同表现,并提供了详细的解决方案。

在尝试通过 ClickOnce 部署我的 C# 应用程序时,遇到了自动更新功能不工作的情况。具体来说,当应用程序从本地系统安装时能够正常接收更新,但如果从服务器安装,则无法检测到任何更新。

为了确保应用程序能够正确地从网络位置检查和应用更新,首先需要确认所有必要的设置都已经正确完成,这包括发布选项卡中的发布 URL 和更新路径等配置项。此外,还应在应用程序启动时启用更新检查功能。

下面是我在项目中使用的更新检查代码片段,该代码旨在处理各种可能的异常情况,如网络连接问题或部署损坏等问题,并向用户展示相应的消息提示。

private void InstallUpdateSyncWithInfo() { UpdateCheckInfo info = null; if (ApplicationDeployment.IsNetworkDeployed) { ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; try { info = ad.CheckForDetailedUpdate(); } catch (DeploymentDownloadException dde) { MessageBox.Show("无法下载新版本的应用程序。请检查您的网络连接,稍后再试。错误信息: " + dde.Message); return; } catch (InvalidDeploymentException ide) { MessageBox.Show("无法检查应用程序的新版本。ClickOnce 部署已损坏,请重新部署应用程序后重试。错误信息: " + ide.Message); return; } catch (InvalidOperationException ioe) { MessageBox.Show("此应用程序无法更新。可能不是 ClickOnce 应用程序。错误信息: " + ioe.Message); return; } if (info.UpdateAvailable) { Boolean doUpdate = true; if (!info.IsUpdateRequired) { DialogResult dr = MessageBox.Show("有可用的更新。是否立即更新应用程序?", "更新可用", MessageBoxButtons.OKCancel); if (dr != DialogResult.OK) { doUpdate = false; } } else { MessageBox.Show("应用程序检测到必须从当前版本升级至版本 " + info.MinimumRequiredVersion.ToString() + ". 应用程序将安装更新并重启。", "更新可用", MessageBoxButtons.OK, MessageBoxIcon.Information); } if (doUpdate) { try { ad.Update(); MessageBox.Show("应用程序已升级,即将重启。"); Application.Restart(); } catch (DeploymentDownloadException dde) { MessageBox.Show("无法安装最新版本的应用程序。请检查您的网络连接,稍后再试。错误信息: " + dde); return; } } } } else { MessageBox.Show("没有可用的更新"); } }

针对上述问题,一个可能的解决方案是修改安装/更新位置为一个目录,而非特定的 HTML 文件。此外,由于 .NET 框架中存在一个可能导致 COMException 和 InvalidOperationException 的错误,建议直接解析清单文件中的版本号并与当前程序集版本进行比较来实现更新检查功能。这种方法虽然较为基础,但在某些情况下更为可靠。

private bool CheckForUpdateAvailable() { Uri updateLocation = ApplicationDeployment.CurrentDeployment.UpdateLocation; WebClient webClient = new WebClient(); webClient.Encoding = Encoding.UTF8; string manifestFile = webClient.DownloadString(updateLocation); int startOfXml = manifestFile.IndexOf('<'); manifestFile = manifestFile.Substring(startOfXml); Version version; XmlDocument doc = new XmlDocument(); doc.LoadXml(manifestFile); XmlNodeList nodesList = doc.GetElementsByTagName("assemblyIdentity"); if (nodesList == null || nodesList.Count <= 0) { throw new XmlException("无法读取 XML 清单文件,这是检查是否有更新所必需的。"); } XmlNode theNode = nodesList[0]; version = new Version(theNode.Attributes["version"].Value); if (version > ApplicationDeployment.CurrentDeployment.CurrentVersion) { return true; } return false; }

最后,在应用程序启动时调用此方法以检查是否有可用更新,并根据结果决定是否执行更新操作。

if (ApplicationDeployment.IsNetworkDeployed) { bool updateIsAvailable; try { updateIsAvailable = CheckForUpdateAvailable(); } catch { // 处理非网络部署等情况 } if (updateIsAvailable) { var ad = ApplicationDeployment.CurrentDeployment; if (ad != null) { ad.Update(); Application.Restart(); } } }

推荐阅读
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
author-avatar
sotoloraboin_678
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有