VB.NET Application.Restart行为 - 意外结果

时间:2017-05-10 16:11:58

标签: .net vb.net auto-update

我有一个带有内置更新程序的应用程序foo.exe。它将连接到服务器,如果有更新,则将当前(正在运行)的应用程序重命名为foo.exe.bak,下载foo.exe并调用Application.Restart以启动foo.exe,现在是新版本。这似乎有效...大部分时间。我运行它的一台计算机似乎总是,有时偶尔会降低新版本,但仍会加载旧版本。通过调用Application.Restart的按钮重新启动应用程序,然后生成正确的版本。

在此失败的重启期间,本地系统上的文件为1.2,服务器上的文件为1.2,但正在运行的版本是我们刚刚更新的1.1。由于updater最近被调整以允许检查DLL更新以及当前的可执行版本,因此它现在检查exe文件的版本(1.2)而不是正在运行的应用程序的版本(1.1)与预期版本,所以不会因版本不匹配而触发另一次更新。最终,这意味着我的应用程序现在有一个错误的方面失败,它认为它是更新版本。

在调用重启之前我有1秒的延迟。将此值增加到5并没有解决问题。 关于Application.Restart如何运作,我有什么遗漏? 我尝试了Shell(Application.ExecutablePath) Application.Exit,但这不起作用 - 所有这一切都是让应用程序退出。有没有可靠的方法让我的应用程序关闭并再次启动foo.exe?

由于

2 个答案:

答案 0 :(得分:0)

毕竟,这是一个时间问题。该应用程序正在超越自身,启动就好像没有需要更新,然后更新程序正在传回一条消息,说“嘿伙计们!我有更新!”该应用程序已经开始。

答案 1 :(得分:-1)

  

将当前(正在运行)的应用程序重命名为foo.exe.bak

您认为这是如何实现的? Windows将不允许您重命名当前正在执行的任何程序文件。

大多数想要进行自动更新的应用程序都会有第二个"更新程序"程序来实现这一点,主程序在检测到更新然后关闭时将启动更新程序。更新程序将等待主程序退出,更新任何需要更新的内容,重新启动主程序,然后退出。

我还看到主程序负责下载"更新"文件,然后启动快速.bat文件,然后退出批处理文件只重命名的东西,然后再次启动程序。

但无论如何,如果您在* .exe文件仍在运行时尝试更新* .exe文件,那么您最终会得到奇怪的结果。

值得注意的另一件事是默认情况下Program Files文件夹对于标准权限用户帐户是只读的。如果您需要最终用户能够更新此文件夹中的文件,则需要在原始安装过程中更改该文件夹的默认权限。