我们的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(字符串 目录,字符串DirectoryNameResID) 在 Microsoft.VisualBasic.FileIO.SpecialDirectories.get_Desktop() 在 Microsoft.VisualBasic.MyServices.SpecialDirectoriesProxy.get_Desktop()
但是虽然这个例子引用了Desktop,但是记住它找不到任何的SpecialDirectories。它不仅限于桌面。
但只是第一次运行(即更新后立即)。此后它会运行良好。
如果进程失败更加严重,与文件系统问题,锁或线程有关,那将更容易理解。但为什么只有My命名空间的这个“次要”问题?
答案 0 :(得分:2)
我现在意识到它与复制的文件无关,而且与一个执行不当的System.Security.Principal.WindowsImpersonationContext有关。
令人惊讶的是,这些事情在发布后5分钟变得清晰。