应用程序启动器如何更新自身

How does an application launcher update itself?

本文关键字:更新 启动 何更新 应用程序      更新时间:2023-10-16

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

我想通过我正在开发的一个特定的非游戏应用程序来推动这个方向。启动器的概念非常合理:它检查更新,替换适当的二进制文件/库,可能运行完整性检查,并启动应用程序。然而,发射器如何自我更新?这往往是一个罕见的事件,但它是如何做到的?启动器是否真的只是重写了它当前运行的二进制文件?或者下载后是否有某种交换步骤?我需要能够向启动器推出(罕见的)更新(尤其是当我在启动器中发现一些错误时)。

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

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

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向我展示了交换技巧在事务文件IO中做得更好。

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

考虑到更新程序应用程序很小,加载速度很快,你可以让它检测、下载、弹出一个对话框说有新版本,并且在旧版本关闭和新版本运行时几乎不会闪烁。

如果您在.NET世界中,有一种部署策略叫做"单击一次"。这是为了解决您所描述的问题而创建的。。。

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

来源:点击一次

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

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