我看到有很多技术可以让用户轻松进行自动更新(例如winsparkle)。 我们遇到的问题是我们希望能够在没有提示的情况下自动更新我们的桌面(c#/c++)应用程序。
如果用户有能力不更新,这会让我们的生活变得地狱(10,000+安装都需要大约每月更新一次)。
我们目前通过 WIX 安装应用程序,重新安装新版本会完全覆盖之前的版本。 这工作正常,但我们希望甚至不必运行新的安装程序,因此自动更新的想法。
我研究过 clickonce,但由于我们的应用程序既是托盘图标/Windows 窗体应用程序又是 Windows 服务,因此通过 ClickOnce 安装服务似乎有些不可行。
有什么建议吗?
要执行此更新行为,您需要两件事:
1) 定期检查更新的更新程序应用程序。如果发现更新,它应该自动安装。大多数商业设置创作工具都包含良好的更新程序应用程序。您可以尝试自己编写更新程序,但这并不像听起来那么容易。
2) 每个产品版本的每用户安装。每用户安装仅在用户配置文件文件夹(AppData、Roaming 文件夹等)和 HKEY_CURRENT_USER 中写入数据。没有程序文件或 HKEY_LOCAL_MACHINE。
需要按用户安装,以便您可以静默执行升级。如果安装是每台机器,较新的 Windows 版本将显示提升提示,用户将不知道发生了什么。
更新程序
一些更新程序使用服务。对于自动更新,这不是真正的解决方案,因为服务安装需要管理员权限。因此您的安装过程和后续更新将显示海拔提示。
另一种方法是使用每用户更新程序应用程序。它不需要任何提升,可以安装在应用程序文件夹中。这种类型的更新程序可以作为计划任务运行,也可以在您的应用程序中运行(在应用程序启动时执行)。
在这两种情况下,您都需要考虑更新程序可能需要自行更新。因此,执行更新的进程必须是临时进程(例如更新程序应用程序的临时副本)。它还应该在没有海拔的情况下运行。这就是为什么服务不是一个好主意。它需要在更新之前自行停止,使用处理更新的临时进程并在完成后重新启动。
以下是我最终对我管理的一些用 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"
}
]}}
应用程序下载该文件并将其本地信息与文件中的最新条目进行比较。
如果最新条目较新(基于提交日期等),它将从分发服务器检索安装程序,检查完整性,然后运行安装程序。
安装程序负责使用最新信息更新注册表中的条目。 现在,我认为你的问题可以从三个角度来回答。 第一个是模块化是否可行,这样您就不必更换所有内容并可以提供增量安装程序,第二个是您是否可以使用知道如何处理更新的技术(我相信 MSI 知道如何处理更新)做)。最后,第三个角度是,如果最新版本的系统或您的应用程序出现问题,您是否有办法让用户回滚。
这个应用程序可以帮助您: https://www.actualupdater.com
据说使用静默模式更新时,海拔提示不会移位。