如何在不提示用户的情况下自动更新我的windows应用程序

本文关键字:更新 我的 应用程序 windows 情况下 提示 用户 | 更新日期: 2024-10-18 10:24:42

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

如果用户有能力不更新,这会让我们的生活陷入地狱(10000多个安装都需要每月更新一次)。

我们目前通过WIX安装我们的应用程序,它重新安装的新版本完全覆盖了以前的内容。这很好,但我们希望甚至不必运行新的安装程序,从而实现自动更新的想法。

我看过clickonce,但由于我们的应用程序既是托盘图标/窗口窗体应用程序,又是windows服务,因此通过clickoncce安装服务似乎有些不可行。

有什么建议吗?

如何在不提示用户的情况下自动更新我的windows应用程序

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

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

2) 每个产品版本的每个用户安装。每个用户的安装只在用户配置文件文件夹(AppData、Roaming文件夹等)和HKEY_CURRENT_user中写入数据。没有程序文件或HKEY_LOCAL_MACHINE。

需要按用户安装,这样您就可以无提示地执行升级。如果是按机器安装,较新的Windows版本将显示提升提示,用户将不知道发生了什么。

更新程序

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

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

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

以下是我为我管理的一些用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"
    }
]}}

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

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

安装程序负责使用最新信息更新注册表中的条目。现在,我相信你的问题有三个角度。第一个问题是模块化是否可能,这样你就不会更换所有东西,并且可以提供delta安装程序,第二个问题是你是否可以使用一种知道如何处理更新的技术(我相信MSI知道如何做到这一点)。最后,第三个角度是,如果最新版本的系统或您的应用程序出现问题,您是否有办法让用户回滚。

相关文章: