应用程序启动器如何更新自身
How does an application launcher update itself?
启动器在游戏中最常见。想想《英雄联盟》、《星际争霸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部署克服了部署中固有的三个主要问题:
来源:点击一次
在开始这个策略之前,我建议研究一下它的利弊,因为有狂热的粉丝和批评者。
简单地说,您将新版本上传到网站(应用程序配置为了解该网站)。在启动时,应用程序会检查网站,如果有更新,则会向用户提供一个对话框。当用户选择应用更新时,应用程序将停止,同时激活"单击一次"组件以应用更改。然后组件重新启动可执行文件,这一切对最终用户来说都是无缝操作。。。
- 从C++本机插件更新Vector3数组
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 如何创建一个空的全局类并在启动时实例化它
- cmake更新缓存的变量
- 更新到莫哈韦后出现cmath错误
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 使用 std::string () const 函数启动线程或未来
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- Qt:当QListView获得新条目时,如何更新QStringList
- ESP32 OTA更新在启动时不断崩溃
- (Windows 10) 在不更新的情况下重新启动C++
- 为什么在 var 未更新的情况下使用,仅在启动 var 后打印
- 使用WinSparkle更新新版本后,它不会自动启动应用程序
- 线程在更新 UI 之前启动
- 如何解决应用无法启动 Windows 10 "Threshold 2"更新(1511,内部版本 15086) 后STATUS_DLL_INIT_FAILED (0xc0000142)
- 使用boost::thread来启动/停止记录数据(第二次更新)