【问题标题】:C# - An approach for an automatic updater for a windows appC# - Windows 应用程序自动更新程序的方法
【发布时间】:2025-07-13 13:35:02
【问题描述】:

我有一个安装在多个远程工作站上的 Windows 应用程序(用 C# 编写...),安装由 MSI 包完成。

正在不时进行更新安装并更改程序,此时,对于每个更新,对于每个站,我们需要转到 .MSI 所在的位置,复制并运行它,然后才开始应用程序。

我希望这样:每当用户尝试启动应用程序时,都会初始化一个后台进程,该进程会将已安装的版本与 .msi 位置上的最新版本进行比较,如果需要更新将运行安装,然后启动应用程序。

问题是无法在程序内完成,因为在安装/升级时程序无法运行。另一个考虑因素是并非所有站点都同时运行,因此我无法安排及时升级,并且无法在站点启动时完成,因为有时需要在站点已经运行时进行更新(站点在我的应用旁边有几个功能)。

我考虑了几种方法,似乎 Windows 服务可以解决问题,但我不知道它是否可以“绑定”到程序的初始化以及它是否可以暂停程序以进行必要的检查和更新,而不仅仅是重新启动应用程序。

我对所有想法持开放态度,因此请不要对我的想法感到有义务...

【问题讨论】:

    标签: c# windows-services windows-installer auto-update


    【解决方案1】:

    此时,对于每次更新,对于每个站我们都需要去哪里.MSI 位于复制它并运行它,然后启动应用程序。

    解雇冒充系统管理员的人。

    除非您在安装程序中做了一些奇怪的事情 - 它应该可以使用您的标准软件分发包。哎呀,只要 MSI 允许管理无 ui 安装,我就可以仅使用活动目录而不使用第三方软件推出更新。

    您尝试解决一个非问题。软件分发是过去 15 到 20 年的解决方案。 MSI 是专门为处理此问题而创建的,因为其他方法也存在问题。

    因此,任何冒充贵公司管理员的人都需要齐心协力,成为其中的一员。什么都不做(除了制作一个好的 MSI),让管理员做他的工作。

    其他一切都会产生很多问题(至少在成本方面)。而且完全不需要。

    【讨论】:

    • 我是系统管理员,所以我将暂时保留启动步骤...我不完全明白你在说什么,正确的做法是什么?
    • 如果你足够大,这是一个问题(不仅仅是 2-3 次安装),那么基本上你应该有软件清单和分发。 Windows 最便宜的解决方案是使用活动目录。 technet.microsoft.com/en-us/library/cc783635(v=ws.10).aspx 在概念上解释了这一点。 (使用 Active Directory 分配和发布软件)。
    • @TomTom,您觉得 ClikcOnce 是一种可以实施的新技术,但建议将广告用于库存。惊讶...
    • 为什么你甚至说我觉得 ClickOnce 是新技术? ClickOnce 用于处理非常有限的一组应用程序。不建议将广告用于库存 - 请阅读我的句子:我说你应该有这个(库存和分销),而广告是最便宜的分销 - 但我说它没有库存。你的基本学校逻辑失败。不,我不喜欢clickonce。我更喜欢控制应用程序。
    【解决方案2】:

    我正在更新我的答案,

    这就是我们所做的......

    1. 创建安装程序/包(您可以在此处为所有用户安装)
    2. 生成引导程序 (https://msdn.microsoft.com/en-us/library/ms165429.aspx 您可以使用此工具创建引导程序 (http://www.softpedia.com/get/Programming/Other-Programming-Files/Bootstrapper-Manifest-Generator.shtml)

      1. 在引导程序中添加依赖和其他条件

      2. 设置更新的 URL

    这将解决您的问题。我回答得太快了,但我们就是这样做的。

    谢谢。

    【讨论】:

    • -1。 ClickOnce 对于某些软件来说是不错的,但对于其他软件来说是地狱。这里没有指定的要求 - 我真的不会建议某人“只使用 clickonce”。
    • @TomTom 我从 2006 年开始使用 click。现在已经 10 多年了。当您以分布式模式安装时,我没有看到任何问题。你对我的回答投了反对票吗?
    • 点击一次不是可行的方法,主要是因为应用程序是按机器安装的,而不是按用户安装的。
    • 这只是说明您的应用程序在功能使用方面的限制。并不是说这是一个问题。但仍然是一个通用的答案....不。有没有想过了解 ClickOnce 和完整安装程序之间的区别?这并不是说它们没有记录在案。可能适用于 90% 的应用程序,但 (a) OP 可能会受到限制,并且 (b) 在公司中,这是“为什么还要为另一种技术烦恼”问题的类型。 msdn.microsoft.com/en-us/library/…
    • 只需阅读您推荐的技术文档即可。想让我教你关于你推荐的技术。 ClickOnce 有许多优点和许多限制。你应该知道他们 - 你推荐它。
    【解决方案3】:

    关于问题中假设的一些cmets和答案:

    “我希望这样:每当用户尝试启动应用程序时,都会初始化一个后台进程,它将已安装的版本与 .msi 位置上的最新版本进行比较,如果需要更新将运行安装和而不是启动应用程序。”

    这可能是一种有用的方法的唯一情况是当 MSI 位于公司的 Web 服务器上时。该网站可以托管您将产品代码、版本、升级发送到的 Web api,它会报告是否有升级、补丁等,以及从中下载它的位置。如前所述,在公司域中,只需使用 AD。

    “问题在于无法在程序内完成,因为在安装/升级时程序无法运行。”

    为什么? Windows Installer 将为最终用户显示 FilesInUse 对话框以关闭正在运行的应用程序。所以这种情况已经处理好了,我不确定你在哪里看到了问题。

    “...如果它可以暂停程序以进行必要的检查和更新,而不是重新启动应用程序。”

    这正是重启管理器的用途。将您的应用程序与 RM 和 Windows Installer 集成将允许您关闭应用程序(保存您需要恢复的任何数据)然后重新启动您,以便您可以恢复您的数据并且用户看到的中断最小。一个例子:

    http://www.codeproject.com/Articles/772868/Restart-Manager-Support-For-Windows-Application

    所以我认为 TomTom 的观点是正确的 - 无需重新发明 AD 的功能,也无需担心如何更新正在运行的程序,或在安装程序更新后如何重新启动程序,因为所有这些问题都已解决几年前。

    【讨论】:

      最近更新 更多