Invalid Operation Exception from C# Process Class
当我使用VSTS调试器查看类Process的实例的属性时,许多属性都用InvalidOperationException标记。为什么?我做错什么了吗?
我正在使用VSTS 2008 C#.Net 2.0开发控制台应用程序。
这是我的代码:
1 2 3 4 5
| System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
myProcess .StartInfo.FileName ="IExplore.exe";
myProcess .StartInfo.Arguments = @"www.google.com";
myProcess .StartInfo.Verb ="runas";
myProcess .Start(); |
和调试器的屏幕截图:
- IExplore进程开始后,大多数属性变为可用。
-
请上传异常消息的详细信息。
-
谢谢Chansik,详细的异常消息(Exception.Message)为"没有进程与此对象相关联"。进程启动后,我进行了测试,这些值开始有效。我感到困惑,为什么在进程开始之前,这些值显示为InvalidOperationException?这是出于什么目的(为什么没有默认值要显示)?
-
InvalidOperation是一个典型的异常,某些程序员在尝试启动过程时可能会遇到该异常。原因之一可能是给定的论证是错误的。验证参数的一种好方法是在cmd行窗口中对其进行测试。如果可以预期结果,那么您很安全。
-
请检查您的文件名之间是否有空格!如果是,只需在路径中使用双引号。
在拍摄调试器图片时您是否真的开始了该过程?这是我希望在调用Start()方法之前看到的屏幕截图。
请注意,常见的模式是创建一个ProcessStartInfo,填充它,然后调用静态的Process.Start(startInfo)方法。这使它在概念上更简单:Process对象在启动之前不会看到。
- 谢谢乔恩,我已经在流程启动后进行了测试,这些值已经生效。我感到困惑,为什么在进程开始之前,这些值显示为InvalidOperationException?这是出于什么目的(为什么没有默认值要显示)?
-
因为吸气剂抛出异常。如果您考虑一下,这是有道理的;在进程启动或退出之前,这些属性将无效。
-
他们绝对不应该返回默认值。如果确实如此,则可能会认为这些值已从实际过程中正确返回。您正在执行的操作等同于要求将null引用的长度作为一个字符串...它没有一个,它不是一个字符串!同样,您没有要询问其句柄数的进程。例外是告诉您您做错了什么:即在启动进程之前获取属性。这永远都不是一件有用的事情,而且例外情况比默认值更好地表明了这一点。
-
嗨,Ed,对于诸如basepriority之类的属性,应该具有一些默认值,并且它只是一个int值,为什么调试器无法显示默认值,为什么它报告InvalidOperationException?
-
谢谢乔,您的答复是合情合理的。
许多属性都标记有InvalidOperationException,因为直到启动该过程为止。对象" myProcess"未与任何正在运行的进程关联,因此无法获取该信息。
尝试在代码之后添加这些语句以启动进程
1 2 3 4 5
| if (myProcess != null)
{
myProcess.WaitForExit();
//or any other statements for that matter
} |
现在,当您位于if语句中时,VSTS调试器将能够显示与对象myProcess相关的大多数属性。发生这种情况的原因是,myProcess对象现在与正在运行的进程" IExplore.exe"相关联。
是的,这是预期的行为,并且在MSDN中也有明确记录。
例如,当进程退出或进程尚未启动时,Process.BasePriority属性可以引发InvalidOperationException异常(请参阅MSDN中的更多详细信息)。