ClickOnce 更新被用户取消,并且不再要求更新

问题描述 投票:0回答:3

我有一个 Windows Forms 应用程序,它是通过 ClickOnce 部署的。在启动应用程序期间,它会检查更新并提示用户进行更新。如果用户选择不安装该会话的更新,则不再询问。这是设计使然还是我错过了任何设置?

如何让它在用户下次启动应用程序时提示用户更新?

c# winforms deployment clickonce
3个回答
26
投票

当用户点击“跳过”时,意味着“1周后再问我”。 没有办法调整这个时间延迟。

如果您同时发布新版本的应用程序,将再次提示用户更新。

您还可以通过以下方式阻止用户跳过更新:

  • 在应用程序启动之前检查更新,并且
  • 通过指定最低版本进行更新

在这种情况下,用户必须更新,否则无法运行程序。 有关详细信息,请参阅MSDN - 选择 ClickOnce 更新策略


4
投票

另一种选择是实现编程式 ClickOnce 更新,您可以自己定义行为。 我怀疑在这种情况下它使用了 blunderbuss 作为苍蝇拍,但如果您想考虑该选项,一个起点是 MSDN - 使用 ClickOnce 部署 API 以编程方式检查应用程序更新


0
投票

我找到了另一个解决方案,而不是等待一周。不过,这种解决方案一般不适用于普通用户。然而,对于我作为一名开发人员(我的电脑上的本地管理员)来说,确实如此。

我不小心跳过了更新。然而,正如我所说,我不想等一周。受到这个 StackOverflow 答案的启发,我意识到 ClickOnce 应用程序将跳过保存在注册表中。我的解决方案是操纵识别用户已跳过更新的标记。

相关的 ClickOnce 信息存储到此注册表位置:

Computer\HKEY_CLASSES_ROOT\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0\PackageMetadata\{2ec93463-b0c3-45e1-8364-327e96aea856}_{3f471841-eef2-47d6-89c0-d028f03a4ad5}
尽管这条路径对于所有这些 GUID 来说似乎相当动态/独立,但在所有情况下它都是相当静态和恒定的。

现在棘手的部分是为您自己的情况找到正确的子目录。每个 ClickOnce 应用程序似乎都有两个目录。在具有最短后缀的目录中,有一个带有键

{2ad613da-6fdb-4671-af9e-18ab2e4df4d8}!UpdateSkipTime
的注册表项。是的,GUID 再次保持不变...

如果您跳过了更新,则键的值是跳过发生时的时间戳。现在,通过将此值设置为较低的值,可以使更新对话框再次出现。 我使用这个 powershell 脚本做到了这一点:

$packageMetadataEntry = "HKEY_CLASSES_ROOT\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0\PackageMetadata\{2ec93463-b0c3-45e1-8364-327e96aea856}_{3f471841-eef2-47d6-89c0-d028f03a4ad5}\"
$appEntry = "foo..bar_0000000000000000_d0653325c3f06cf6"
$registryPath = $packageMetadataEntry + $appEntry
$valueName = "{2ad613da-6fdb-4671-af9e-18ab2e4df4d8}!UpdateSkipTime"
$binaryData = [system.Text.Encoding]::Unicode.GetBytes("0001/01/01 00:00:00`0") # has to be terminated with a null byte (`0)

[Microsoft.Win32.Registry]::SetValue($registryPath, $valueName, $binaryData, [Microsoft.Win32.RegistryValueKind]::Binary)

⚠️免责声明: 在进行任何操作之前最好备份该注册表项! 😉

© www.soinside.com 2019 - 2024. All rights reserved.