C# 从进程访问文件名仅在调试语句之后有效?

C# 从进程访问文件名仅在调试语句之后有效?,c#,visual-studio,C#,Visual Studio,我这里有一个有趣的问题,因为只有在访问文件名之前没有调试语句时,才会出现此错误 //make a new process process = new Process(); process.StartInfo.FileName = executable; process.Start(); Debug.Print((process.MainModule == null).ToString()); Debug.Print(process.MainModule.FileName); path = pro

我这里有一个有趣的问题,因为只有在访问文件名之前没有调试语句时,才会出现此错误

//make a new process
process = new Process();
process.StartInfo.FileName = executable;
process.Start();
Debug.Print((process.MainModule == null).ToString());
Debug.Print(process.MainModule.FileName);
path = process.MainModule.FileName;
process.Kill();
我基本上只想访问我交给它的可执行文件的文件路径(例如:chrome.exe,这样它就可以找到路径,我以后可以得到图标,等等)。但是,如果没有调试语句,代码就无法工作,并为

path = process.MainModule.FileName

我敢肯定,这不是获取可执行文件路径的最有效方法,如果有人对此有其他方法,或者对发生这种情况的原因有任何想法,我们将不胜感激。

上述示例实际上是一种可怕的方法。某些进程不会终止,并且启动进程所需的时间会因您尝试启动的内容而发生很大变化。我建议建立一个所有已安装程序的列表,并对其进行排序,这样会更加可靠


这里有一个关于如何处理()的链接。

也许有人有一个更具技术信息的答案,但我的猜测是,当您包括调试行时,在访问
MainModule
之前,流程有多一点时间初始化到就绪状态。听起来很奇怪,但我在
System.Diagnostics.Process
中看到过一些奇怪的东西。例如,尝试放置
Thread.Sleep(1)
(或一些不同的间隔),而不是调试行,那么它是否也可以工作?@blins我认为你是对的,似乎只需要多一点时间来设置它。我添加了
Thread.Sleep(1)
,它在没有调试语句的情况下按预期工作,现在我只是想知道是否有更“干净”的方法来获得相同的结果。请看这里: