【问题标题】:Invalid Operation Exception from C# Process Class来自 C# 进程类的无效操作异常
【发布时间】:2010-11-12 05:18:33
【问题描述】:

当我使用 VSTS 调试器查看类Process 的实例的属性时,许多属性都标有InvalidOperationException。为什么?我做错了什么吗?

我正在使用 VSTS 2008 + C# + .Net 2.0 开发控制台应用程序。

这是我的代码:

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 是一些程序员在尝试启动进程时可能遇到的典型异常。原因之一可能是给定的论点是错误的。验证参数的一个好方法是在命令行窗口上对其进行测试。如果结果符合预期,那么您是安全的。
  • 请检查您的文件名之间是否有空格!如果是,只需使用双引号作为路径。

标签: c# .net visual-studio-2008 process invalidoperationexception


【解决方案1】:

许多属性都标有 InvalidOperationException,因为直到您开始该过程。对象“myProcess”没有与任何正在运行的进程相关联,因此它无法获取信息。

尝试在启动进程的代码之后添加这些语句

if (myProcess != null)  
{
  myProcess.WaitForExit();
   //or any other statements for that matter
}

现在,当您在 if 语句中时,VSTS 调试器将能够显示与对象 myProcess 关联的大部分属性。发生这种情况是因为,myProcess 对象现在与正在运行的进程“IExplore.exe”相关联。

【讨论】:

    【解决方案2】:

    是的,这是预期行为,并且在 MSDN 中也有明确记录。

    例如,当进程退出或进程尚未启动时,Process.BasePriority 属性可能会引发 InvalidOperationException 异常(请参阅MSDN 中的更多详细信息)。

    【讨论】:

    • 感谢 Chansik,您的回复很有道理!
    【解决方案3】:

    在拍摄调试器图片时,您是否真的开始了该过程?这是我希望在调用 Start() 方法之前看到的屏幕截图。

    注意,常见的模式是创建一个ProcessStartInfo,填充它,然后调用静态Process.Start(startInfo) 方法。这使得它在概念上更简单:在 Process 对象启动之前,您不会看到它。

    【讨论】:

    • 感谢乔恩,我在进程启动后进行了测试,这些值变得有效。我很困惑为什么在进程开始之前值显示为 InvalidOperationException?是为了什么目的(为什么不显示默认值)?
    • 因为 getter 正在抛出异常。如果您考虑一下,这是有道理的;在进程开始或退出之前,这些属性将无效。
    • 他们绝对应该返回默认值。如果他们这样做了,人们可能会认为这些值是从实际过程中正确返回的。你所做的相当于询问一个空引用作为字符串的长度......它没有,它不是一个字符串!同样,您没有 进程来询问其句柄计数等。异常是告诉您您做错了什么:即在启动进程之前获取属性。这永远不会是一件有用的事情,而例外是比默认值更好的指标。
    • 嗨 Ed,对于像 basepriority 这样的属性,应该有一些默认值,它只是一个 int,为什么调试器无法显示默认值以及为什么它会报告 InvalidOperationException?
    • 谢谢乔,你的回复很有道理。
    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 2010-10-02
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多