c# - 为什么即使进程确实存在,Process.WaitForExit 也会抛出 "no process"异常?

标签 c# .net process .net-3.5 windows-server-2003

我有一个包含此代码的 Windows 服务:

    public static void ExtractTextInner(string source, string destination)
    {   
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = EXTRACTOR_EXE_FILEPATH
        startInfo.Arguments = "\"" + source + "\" \"" + destination + "\"";
        startInfo.CreateNoWindow = true;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        Process process = new Process();
        process.StartInfo = startInfo;

        process.Start();
        process.WaitForExit();
        int exitCode = process.ExitCode;
        process.Close();
        if (exitCode != 0)
        {
            switch (exitCode)
            {
                case 1:
                throw new ApplicationException("IFilter Extraction Failed");
                default:
                throw new ApplicationException("Unknown Exit Code:" + exitCode.ToString());
            }
        }
    }

这段代码的目的是在文档上运行 IFilter 提取,我们使用一个单独的进程,因为一些 IFilter 是出了名的不稳定。

现在这段代码在 Windows 7 和 Server 2008 R2 机器上运行得很好,但在 Windows Server 2003 上,WaitForExit 立即抛出“没有与此 Process 对象关联的进程”异常。该进程确实存在并且可以毫无问题地完成其任务。

有人看到了吗?谁能解释为什么 WaitForExit 会抛出这个错误?

附加信息

如果我将此代码放在控制台应用程序中并在 Windws Server 2003 机器上运行它也能正常运行,因此在 Windows Server 2003 机器上的服务中运行它似乎是一个特定问题。

最佳答案

启动进程时,使用 System.Diagnostics.Process类,系统可以使用 CreateProcessShellExecuteEx Win32 函数。使用 CreateProcess 时只能启动可执行文件。使用 ShellExecuteEx 时,任何可以从 shell 使用“开始->运行”命令启动的文件。

然而,这些是完全不同的启动流程的方式。 ShellExecuteEx 涉及 shell,例如,通过使用存储在 HKCR\<progid>\shell\<verb> 下的信息,可以重新使用现有的 Word 或 Excel 实例打开文档。注册表项。例如,这可能涉及使用 DDE 搜索并激活现有的 Excel 实例。

请参阅有关 ShellExecuteEx 的文档的 SHELLEXECUTEINFO :

请注意 ShellExecuteEx可能会也可能不会返回 hProcess,具体取决于是否启动了新进程。这就是您所看到的行为。

CreateProcess是一个较低级别的函数,直接创建一个进程,并简单地传递等效参数。它总是返回一个进程句柄。

注意:因为您似乎正在启动一个可执行文件,所以没有 hProcess 有点令人惊讶。由 ShellExecuteEx 返回.尽管如此,如果您想确保获得进程句柄,请使用 UseShellExecute = false是正确的做法。

关于c# - 为什么即使进程确实存在,Process.WaitForExit 也会抛出 "no process"异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9110564/

相关文章:

c# - 花了很长时间找不到 Selenium C# 元素

c# - 如何使用对象从 DotNet 3.5 Web 应用程序调用 Web API?

c# - 如何使用 EventBuilder 创建事件?

java - 如何为 Runtime.exec 提供相对路径

c# - 从 C# 启动 Excel 并在 "Save"上关闭它

C# 正则表达式仅在标签外部替换字符串

c# - 静态类的好处

c# - .Net Standard 4.7.1 在序列化期间无法加载 System.Private.CoreLib

.net - 对于 .NET DateTime 类型,为什么推断的数据库类型是 SqlDbTypes.DateTime 而不是 SqlDbTypes.DateTime2?

multithreading - 轻量级与重量级流程