VB.NET Application.Restart 行为 - 意外结果
VB.NET Application.Restart behaviour - unexpected result
我有一个带有内置更新程序的应用程序 foo.exe。它将连接到服务器,如果有更新,将当前 (运行ning) 应用程序重命名为 foo.exe.bak,下载 foo.exe 并调用 Application.Restart
以启动 foo.exe 现在是新版本了。这似乎工作......大部分时间。我 运行 的一台电脑似乎总是,而其他人偶尔会关闭新版本但仍然加载旧版本。通过调用 Application.Restart
的按钮重新启动应用程序,然后显示正确的版本。
在这次失败的重启期间,本地系统上的文件是1.2,服务器上是1.2,但是运行ning版本是我们刚刚更新的1.1。由于最近对更新程序进行了调整以允许检查 DLL 更新以及当前的可执行版本,它现在正在检查 exe 文件的版本 (1.2) 而不是 运行ning 应用程序的版本 (1.1)针对预期版本,因此不会由于版本不匹配而触发另一个更新。最终这意味着我的应用程序现在有错误的一面故障,它认为它是更新版本。
在调用重启之前我有 1 秒的延迟。将此增加到五个并没有解决问题。
关于 Application.Restart
的工作原理,我是否遗漏了什么?
我尝试了 Shell(Application.ExecutablePath)
Application.Exit
但这没有用 - 它所做的只是让应用程序退出。有没有可靠的方法让我的应用程序关闭并重新启动 foo.exe?
谢谢
renames the current (running) application to foo.exe.bak
您认为这是如何实现的? Windows 将不允许您重命名当前正在执行的任何程序文件。
大多数想要进行自动更新的应用程序都会有第二个 "updater" 程序来完成此操作,其中主程序会在检测到更新时启动更新程序,然后关闭。更新程序会等到主程序退出,更新所有需要更新的东西,重启主程序,然后退出。
我还看到主程序负责下载 "update" 文件,然后在它退出之前启动一个快速的 .bat 文件,批处理文件只重命名一些东西,然后再次启动程序。
但无论哪种方式,如果您在 *.exe 文件仍然是 运行 时尝试更新您的 *.exe 文件,您将得到奇怪的结果。
另一件值得注意的事情是,默认情况下,Program Files 文件夹对于标准权限用户帐户是只读的。如果您需要您的最终用户能够更新此文件夹中的文件,您需要在原始安装过程中更改该文件夹的默认权限。
毕竟,这是一个时间问题。应用程序超前了,启动时就好像不需要更新一样,然后更新程序返回一条消息说 "Hey guys! I've got an update!" 应用程序已经启动的时间。
我有一个带有内置更新程序的应用程序 foo.exe。它将连接到服务器,如果有更新,将当前 (运行ning) 应用程序重命名为 foo.exe.bak,下载 foo.exe 并调用 Application.Restart
以启动 foo.exe 现在是新版本了。这似乎工作......大部分时间。我 运行 的一台电脑似乎总是,而其他人偶尔会关闭新版本但仍然加载旧版本。通过调用 Application.Restart
的按钮重新启动应用程序,然后显示正确的版本。
在这次失败的重启期间,本地系统上的文件是1.2,服务器上是1.2,但是运行ning版本是我们刚刚更新的1.1。由于最近对更新程序进行了调整以允许检查 DLL 更新以及当前的可执行版本,它现在正在检查 exe 文件的版本 (1.2) 而不是 运行ning 应用程序的版本 (1.1)针对预期版本,因此不会由于版本不匹配而触发另一个更新。最终这意味着我的应用程序现在有错误的一面故障,它认为它是更新版本。
在调用重启之前我有 1 秒的延迟。将此增加到五个并没有解决问题。
关于 Application.Restart
的工作原理,我是否遗漏了什么?
我尝试了 Shell(Application.ExecutablePath)
Application.Exit
但这没有用 - 它所做的只是让应用程序退出。有没有可靠的方法让我的应用程序关闭并重新启动 foo.exe?
谢谢
renames the current (running) application to foo.exe.bak
您认为这是如何实现的? Windows 将不允许您重命名当前正在执行的任何程序文件。
大多数想要进行自动更新的应用程序都会有第二个 "updater" 程序来完成此操作,其中主程序会在检测到更新时启动更新程序,然后关闭。更新程序会等到主程序退出,更新所有需要更新的东西,重启主程序,然后退出。
我还看到主程序负责下载 "update" 文件,然后在它退出之前启动一个快速的 .bat 文件,批处理文件只重命名一些东西,然后再次启动程序。
但无论哪种方式,如果您在 *.exe 文件仍然是 运行 时尝试更新您的 *.exe 文件,您将得到奇怪的结果。
另一件值得注意的事情是,默认情况下,Program Files 文件夹对于标准权限用户帐户是只读的。如果您需要您的最终用户能够更新此文件夹中的文件,您需要在原始安装过程中更改该文件夹的默认权限。
毕竟,这是一个时间问题。应用程序超前了,启动时就好像不需要更新一样,然后更新程序返回一条消息说 "Hey guys! I've got an update!" 应用程序已经启动的时间。