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

发射器在游戏中最常见。 想想英雄联盟,星际争霸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, don't 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世界中,则会有一个名为“Click Once”的部署策略。 这是为了解决你所描述的问题而创建的……

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

来源: 点击一次

在着手这个策略之前,我建议研究它的优点和缺点,因为有狂热的粉丝和批评者。

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

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

鉴于更新程序应用程序很小并且加载速度快,您可以让它检测,下载,粘贴一个对话框,说有新版本,并且随着旧版本关闭并且新版本运行起来几乎没有闪烁。