我有一个带有内置更新程序的应用程序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?
由于
答案 0 :(得分:0)
毕竟,这是一个时间问题。该应用程序正在超越自身,启动就好像没有需要更新,然后更新程序正在传回一条消息,说“嘿伙计们!我有更新!”该应用程序已经开始。
答案 1 :(得分:-1)
将当前(正在运行)的应用程序重命名为foo.exe.bak
您认为这是如何实现的? Windows将不允许您重命名当前正在执行的任何程序文件。
大多数想要进行自动更新的应用程序都会有第二个"更新程序"程序来实现这一点,主程序在检测到更新然后关闭时将启动更新程序。更新程序将等待主程序退出,更新任何需要更新的内容,重新启动主程序,然后退出。
我还看到主程序负责下载"更新"文件,然后启动快速.bat文件,然后退出批处理文件只重命名的东西,然后再次启动程序。
但无论如何,如果您在* .exe文件仍在运行时尝试更新* .exe文件,那么您最终会得到奇怪的结果。
值得注意的另一件事是默认情况下Program Files文件夹对于标准权限用户帐户是只读的。如果您需要最终用户能够更新此文件夹中的文件,则需要在原始安装过程中更改该文件夹的默认权限。