ClickOnce应用程序跳过请求更新(或如果选择跳过则无法启动)

23

我更新了ClickOnce应用程序,然后当用户运行时,会询问他们是否要安装新版本。

我在一个高度受管制的环境中工作。当有更新可用时,必须安装它(旧版本不保证与数据库的向后兼容性)。

另一个选项是如果跳过,则运行失败(这也很好用)。

我需要一种方式来阻止他们运行旧版本的应用程序。

5个回答

44

本文回答了你的问题。我指向文章而不是直接发布答案,因为文章中的所有内容都值得了解。

http://www.sayedhashimi.com/CategoryView,category,ClickOnce.aspx

以下是文章中相关的摘录:

强制 ClickOnce 更新

ClickOnce 的一个重要卖点是自动更新。关于更新,我常常遇到的问题是“如何强制用户更新?”

关于强制更新,有三件事情需要知道:

1)如果您的应用程序是在线应用程序,则用户始终会运行最新版本;在线应用程序每次访问时都会下载。因此,在线应用程序默认情况下进行强制更新。

2)如果您的应用程序是已安装应用程序,则可以使用 MinimumRequiredVersion 属性来强制更新。如果您使用 Visual Studio 发布应用程序,则可以从“更新”对话框中设置此属性。

3)最后需要注意的一点是,如果您的应用程序是已安装应用程序(并且您没有设置 MinimumRequiredVersion 属性),仅当用户从“开始菜单”快捷方式启动应用程序时,ClickOnce 才会提示用户更新可用的对话框。也就是说,如果应用程序是已安装应用程序,并且用户从 URL 启动应用程序,则 ClickOnce 强制进行更新。


我还找到了另一篇好文章:

ClickOnce:为智能客户端部署带来便捷和可靠性


谢谢回答,非常有帮助! :) 还要注意一下,sayedhashimi.com的链接已经失效了。 - deadlydog
1
我已经记录了一个过程,用于在使用第二种方法时自动更新MinimumRequiredVersion属性。该过程详见http://geekswithblogs.net/deadlydog/archive/2012/08/15/force-clickonce-applications-to-automatically-update-without-prompting-user.aspx。 - deadlydog
我现在创建了一个NuGet包,它自动处理了我上面评论中提到的所有设置/安装。NuGet包位于https://nuget.org/packages/AutoUpdateProjectsMinimumRequiredClickOnceVersion,并且这篇博客文章对其进行了一些解释(https://deadlydog.wordpress.com/2013/03/08/force-your-clickonce-app-to-update-without-prompting-user-now-on-nuget/)。 - deadlydog
3
这是一个不同网站上第一个链接的缓存内容 - http://sedodream.com/CategoryView,category,ClickOnce.aspx - Victor F
第一个链接似乎已经失效了(不在DNS中?)。 - Peter Mortensen
从Visual Studio 2019版本16.8开始,您可以使用发布工具来发布.NET Core 3.1、.NET 5或更新的Windows桌面应用程序。然而,ClickOnce的.NET版本被大幅削弱。只有用户提示更新(跳过一次,以后不再提示),或者强制更新并指定版本的“MinimumRequiredVersion”属性。如果“MinimumRequiredVersion”小于跳过的版本,则用户将在可用更新版本新于跳过的版本时才会收到更新提示。 - Martossy Alex

6
这个对我非常有帮助。请将以下内容添加到项目文件中:

这个方法对我很有效。将以下内容添加到项目文件中:

<UpdateRequired>true</UpdateRequired>
<MinimumRequiredVersion>$(ApplicationVersion)</MinimumRequiredVersion>

请注意,在项目文件中,ApplicationVersion 的值不能像 1.0.0.*这样,并且应在构建时递增以使自动更新功能正常工作。
如果使用 TeamCity,要递增版本号,请转到您的项目的构建配置页面,设置以下系统属性:
system.ApplicationVersion = %build.number%

您可以使用以下类似的方式让MSBuild按时间递增版本号:

<UpdateRequired>true</UpdateRequired>
<BuildNumber>$([System.DateTime]::Now.ToString(yyyyMMdd))</BuildNumber>
<RevisionNumber>$([System.DateTime]::Now.ToString(mmss))</RevisionNumber>
<ApplicationVersion>1.0.$(BuildNumber).$(RevisionNumber)</ApplicationVersion>
<MinimumRequiredVersion>$(ApplicationVersion)</MinimumRequiredVersion>

2

1

我通过取消勾选应用程序应检查更新,使其对我起作用,并在两个版本后开始自动更新而无需提示用户。

Enter image description here


3
只有在使用ClickOnce API处理代码更新时,这才能起作用:http://msdn.microsoft.com/en-us/library/ms404263.aspx。 - Uri Abramson
1
是的,我的代码正在处理 Program.cs 中的更新,如果程序集有更新版本,我会重新加载代码。 - PUG

0

如果要强制客户端更新,您必须将最低版本字段设置为当前正在部署的版本,这将强制更新而无需选择“跳过”选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接