Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序启动器如何更新自身?_C#_Java_C++_Launcher - Fatal编程技术网

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

C# 应用程序启动器如何更新自身?,c#,java,c++,launcher,C#,Java,C++,Launcher,发射器在游戏中最常见。想想传说联盟,星际争霸2,或者几乎所有的MMO。在开始真正的游戏之前,你有一个小的launcher应用程序,负责更新和补丁 我想用我正在开发的一个特定的非游戏应用程序朝这个方向发展。启动器的概念非常合理:它检查更新,替换适当的二进制文件/库,可能运行完整性检查,并启动应用程序。但是,启动器如何自我更新?这往往是一个罕见的事件,但它是如何做到的?启动器真的只是写在它当前运行的二进制文件上吗?或者下载后是否有某种交换步骤?我需要能够推出(罕见的)更新的发射器(特别是如果我发现一

发射器在游戏中最常见。想想传说联盟,星际争霸2,或者几乎所有的MMO。在开始真正的游戏之前,你有一个小的launcher应用程序,负责更新和补丁

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


我的专案将在C语言中,但我对概念上类似的C++和/或java解决方案感兴趣,也可以参考。

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

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

资料来源:

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


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

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


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

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


已经向我展示了交换技巧在使用时做得更好。

谢谢分享。我将研究ClickOnce,但我仍然对直接基于代码的解决方案感兴趣。我想从概念上理解这个过程,如果我需要自己编写代码的话。我想OP是在寻找用于实现类似系统的技术。这并不能解释如何更新启动器。无论如何,您仍然必须更新“单击一次”启动器。如果它自动更新自己,那么也许你可以详细说明这是如何实现的?@AndréCaron,这个链接非常清楚地解释了发射器是如何更新自己的。我建议你先阅读它,然后带着剩下的问题返回。一旦一个程序被加载到内存中,它就不应该真正关心二进制图像文件从哪里来,所以你应该被允许覆盖它。然后,你所需要做的就是重新启动程序,也许像
exec
@KerrekSB这样的东西听起来很简单。不过,我对最后一步还有些模糊。那么,在单独的进程中运行程序,然后退出?@KerrekSB,Windows会在可执行文件运行时锁定该文件。部分原因是某些部分可能无法立即加载。当我读到这篇文章时,我真的很想知道启动器首先解决了什么问题。如果你打算写一个自我更新的程序,为什么不干脆完全避开启动器呢?@AndréCaron:它是一个更小的可执行文件,打开速度更快,并且通常比主程序有其他用途。这肯定给了我一些想法。我现在在脑子里琢磨。如果连接中断了?@GaryVass:我以为临时文件会解决这个问题。你看到我的设计有什么缺陷吗?所有下载都将保存到一个单独的文件
B
,直到完成,然后应用到另一个文件
C
/
D
,直到在执行之前完成。“无故障交换技巧”位指的是什么?如何保证连续两次更名有效?(在Windows上,您可以始终使用文件系统事务,但我不认为这是您的意思)。@ MooiW鸭:我知道C++版本,我想知道是否有类似的文件技巧。您正在接近事务,但它们并不是真正的故障安全。退房
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