1

我们的 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 命名空间的这个“小”问题呢?

4

1 回答 1

2

我现在意识到这与复制的文件无关,而与实施不当的 System.Security.Principal.WindowsImpersonationContext 无关。

令人惊讶的是,这些事情在发布后 5 分钟就变得清晰起来。

于 2010-01-13T21:35:45.233 回答