如何自动更新我的Windows应用程序而不提示用户这样做?

时间:2015-03-05 17:15:28

标签: c# windows-installer auto-update

我已经看到有很多技术可以让用户轻松自动更新(例如winsparkle)。我们遇到的问题是我们希望能够在不提示的情况下自动更新我们的桌面(c#/ c ++)应用程序。

如果用户有能力不更新它会让我们的生活变得地狱(10,000多个安装都需要每月更新一次)。

我们目前通过WIX安装我们的应用程序,并重新安装新版本完全覆盖之前的版本。这很好但我们甚至不想运行新的安装程序,因此自动更新的想法。

我看过clickonce,但由于我们的应用程序既是托盘图标/ Windows窗体应用程序又是Windows服务,看来通过ClickOnce安装服务有点不可行。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

要执行此更新行为,您需要做两件事:

1)更新程序应用程序,定期检查更新。如果发现更新,则应自动安装。大多数商业设置创作工具包括良好的更新程序应用程序您可以尝试自己编写更新程序,但这并不像听起来那么容易。

2)每个产品版本的每用户安装。每用户安装仅在用户配置文件文件夹(AppData,漫游文件夹等)和HKEY_CURRENT_USER中写入数据。没有程序文件或HKEY_LOCAL_MACHINE。

需要按用户安装,以便您可以静默执行升级。如果每台机器安装,则较新的Windows版本将显示提升提示,用户将不知道发生了什么。

更新程序

某些更新程序使用服务。对于自动更新,这不是真正的解决方案,因为服务安装需要管理员权限。因此,您的安装过程和后续更新将显示提升提示。

另一种方法是使用每用户Updater应用程序。它不需要任何提升,它可以安装在应用程序文件夹中。这种类型的更新程序既可以作为计划任务运行,也可以从应用程序中运行(在应用程序启动时执行)。

在这两种情况下,您都需要考虑更新程序可能需要自行更新。因此,执行更新的过程必须是临时过程(例如更新程序应用程序的临时副本)。它也应该没有高程运行。这就是服务不是一个好主意的原因。它需要在更新之前自行停止,使用一个处理更新的临时进程,并在完成后再次启动。

答案 1 :(得分:0)

这是我最终为我管理的一些应用程序所做的事情,这些应用程序是用 C# 编写的。

我分发了一个基于 InnoSetup 的安装程序来部署用户系统上的文件,应用程序将信息版本存储在注册表中。 该应用程序具有在启动时检查可用更新并提示用户的机制。该系统基于包含如下基本结构的 JSON 清单:

{
"releases": [
    {
        "CommitDate": "2020-09-05",
        "Version": "0.1.0.0",
        "VersionString": "0.1.0+19",
        "SHA": "4ff750da44b41e569daf3c62f4495a8ee2b25f08",
        "InstallerMd5Sum": "805497b5c13ee070b7465bb32689e0dd"
    },
    {
        "CommitDate": "2020-09-07",
        "Version": "0.1.0.0",
        "VersionString": "0.1.0+22",
        "SHA": "a04ec929b21230ba0e2577617713d10b106266e9",
        "InstallerMd5Sum": "805497b5c13ee070b7465bb32689e0dd"
    }
]}}

应用程序下载该文件并将其本地信息与文件中的最新条目进行比较。

如果最新的条目更新(基于提交日期等),它会从分发服务器检索安装程序,检查完整性,然后运行安装程序。

安装程序负责使用最新信息更新注册表中的条目。 现在,我相信你的问题有三个角度。 第一个是模块化是否可能,以便您最终不会替换所有内容并可以提供增量安装程序,第二个是您是否可以使用知道如何处理更新的技术 (which I believe MSI knows how to do)。最后,第三个角度是您是否有办法让用户在最新版本的系统或您的应用程序出现问题时回滚。