我们的 Winform 应用由 Main.exe 和 Launcher.exe 组成。Launcher 应用程序的目的是检查 Main.exe 的更新版本。
如果它没有找到更新,它会使用 System.Diagnostics.Process.Start 启动 Main.exe
如果找到更新,它将新的 Main.exe 复制到相应位置并以相同的方式启动 Main.exe(在这种情况下,它将是 Main.exe 的新副本)。
这是 Process.Start 代码:
Dim p As New ProcessStartInfo
p.FileName = "Main.exe"
p.WindowStyle = ProcessWindowStyle.Normal
Process.Start(p)
无论是否有更新,此代码都会执行,并且始终成功启动 Main.exe。
但是我们的 Main.exe,如果它是第一次运行(即更新后),将在任何引用 My 命名空间的行上出错,例如 My.Settings 或 My.Computer.FileSystem
例如此行将导致错误:
Msgbox(My.Computer.FileSystem.SpecialDirectories.Desktop)
这是错误:
System.IO.DirectoryNotFoundException:找不到特殊目录“桌面”。在 Microsoft.VisualBasic.FileIO.SpecialDirectories.GetDirectoryPath(String Directory, String DirectoryNameResID) 在 Microsoft.VisualBasic.FileIO.SpecialDirectories.get_Desktop() 在 Microsoft.VisualBasic.MyServices.SpecialDirectoriesProxy.get_Desktop()
但是,虽然此示例是指桌面,但请记住它找不到任何 SpecialDirectories。它不仅限于桌面。
但只是第一次运行(即更新后立即)。此后它将运行良好。
如果进程失败得更厉害,与文件系统问题、锁或线程有关,那就更容易理解了。但是为什么只是 My 命名空间的这个“小”问题呢?