【问题标题】:How does an application launcher update itself?应用程序启动器如何自我更新?
【发布时间】:2012-02-15 05:04:41
【问题描述】:

启动器在游戏中最为常见。想想英雄联盟、星际争霸 II 或几乎所有的 MMO。在开始实际游戏之前,您有一个负责更新和修补的小型启动器应用程序。

我想通过我正在开发的特定非游戏应用程序来推动这个方向。启动器的概念非常有意义:它检查更新、替换适当的二进制文件/库、可能运行完整性检查并启动应用程序。但是,启动器如何自我更新?这往往是一个罕见的事件,但它是如何完成的?启动器是否真的只是覆盖了它当前运行的二进制文件?还是下载后有某种交换步骤?我需要能够向启动器推送(罕见的)更新(特别是如果我在启动器中发现了一些错误)。

我的特定项目将使用 C#,但我也对概念上相似的 C++ 和/或 Java 解决方案感兴趣,以供将来参考。

【问题讨论】:

  • 一旦程序被加载到内存中,它不应该真正关心二进制图像文件是否来自它的来源,所以你应该被允许覆盖它。然后你需要做的就是重新启动程序,也许是exec
  • @KerrekSB 听起来很简单。不过,我对最后一步还是有点模糊。那么,在单独的进程中运行程序然后退出?
  • @KerrekSB,Windows 在运行时锁定可执行文件。部分原因是某些部分可能不会立即加载。
  • 当我读到这篇文章时,我真的很想知道启动器首先解决了什么问题。如果你还是要编写一个自更新程序,为什么不完全避免启动器呢?
  • @AndréCaron:它是一个更小的可执行文件,打开速度更快,并且通常比主程序有另一个用途。

标签: c# java c++ launcher


【解决方案1】:

我从未尝试过,但这是我的猜测(假设您无法覆盖正在执行的文件。如果可以,这一切都更简单)

Updater A checks if its the newest version
If launcher isnt the newest version
    Download the differences (to save bandwidth) to file B
    Apply the delta to own code into file C
    Launch file C.
    Close
If file C exists (update happened recently)
    Try to delete C  (update was previous launch, delete temporary file)
    If delete fails  (We are C, means A is out of date)
        Copy C over A  (update launcher)
        Note that you can keep going, dont have to restart even though we are C.
If game isnt newest version
    Download the differences (to save bandwidth) to file B
    Apply the delta to game into file D
    delete game
    Rename D -> game
Run game

André Caron 向我展示了使用transactional file IO 可以更好地完成交换技巧。

【讨论】:

  • 这绝对给了我一些想法。我现在正在脑海中考虑它们。
  • 如果连接中断?
  • @GaryVass:我认为临时文件可以解决这个问题。你在我的设计的某个地方看到了缺陷吗?所有下载都到一个单独的文件 B 直到完成,然后应用到另一个文件 C/D 直到完成后再执行。
  • “无失败交换技巧”位指的是什么?如何保证连续两次重命名有效? (在 Windows 上,您始终可以使用文件系统事务,但我不认为这是您的意思)。
  • @MooingDuck:我知道 C++ 版本,我想知道文件是否有类似的技巧。您正在近似交易,但它们并不是真正的故障安全。查看transactional NTFS
【解决方案2】:

基本上,启动器会检查自己是否有更新的版本,如果有,则启动任务以获取新版本,然后执行它然后关闭。

鉴于更新程序应用程序很小且加载速度很快,您可以让它检测、下载、显示一个对话框以告知有新版本,并且在旧版本关闭和新版本运行时几乎不会闪烁。

【讨论】:

    【解决方案3】:

    如果您身处 .NET 世界,有一种部署策略称为“单击一次”。这是为了解决您描述的问题而创建的...

    ClickOnce 是一种部署技术,可让您创建自我更新的基于 Windows 的应用程序,这些应用程序可以通过最少的用户交互来安装和运行。 ClickOnce 部署克服了部署中固有的三个主要问题:

    来源:Click Once

    在开始实施此策略之前,我建议先研究一下它的利弊,因为有狂热的粉丝和批评者。

    简而言之,您将新版本上传到网站(应用程序配置为了解该网站)。在启动时,应用程序会检查站点,如果有更新,则会向用户提供一个对话框。当用户选择应用更新时,应用程序停止,同时激活“单击一次”组件以应用更改。然后组件重新启动可执行文件,这对最终用户来说都是无缝操作...

    【讨论】:

    • 感谢您分享此内容。我将研究 ClickOnce,但我仍然对直接基于代码的解决方案感兴趣。如果我需要自己编写代码,我想从概念上理解这个过程。
    • 我认为 OP 正在寻找用于实现类似系统的技术。这并没有解释如何更新启动器。无论如何,您仍然必须以某种方式更新“单击一次”启动器。如果它自动更新,那么也许您可以详细说明这是如何实现的?
    • @AndréCaron,该链接非常清楚地说明了启动器如何自我更新。我建议阅读它,然后返回您的任何剩余问题
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2013-03-17
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多