为什么即使进程确实存在,Process.WaitForExit也会抛出"无进程"异常?

Ant*_*nes 12 .net c# windows-server-2003 .net-3.5

我有一个包含此代码的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());
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这段代码的目的是在文档上运行IFilter提取,我们使用一个单独的过程,因为一些IFilter是众所周知的片状.

现在,此代码在Windows 7和Server 2008 R2机箱上运行完全正常,但在Windows Server 2003上,会WaitForExit立即抛出"没有与此Process对象关联的进程"异常.该过程确实存在并完成其任务而没有问题.

谁见过这个?任何人都可以解释为什么WaitForExit会出现这个错误?

附加信息

如果我将此代码放在控制台应用程序中并运行它也可以在Windws Server 2003框上正常工作,因此它似乎是在Windows Server 2003框中的服务中运行此代码的特定问题.

Ben*_*Ben 15

在启动进程时,使用System.Diagnostics.Process类,系统可以使用CreateProcessShellExecuteExWin32函数.当CreateProcess只使用可执行文件时可以启动.使用时ShellExecuteEx,可以使用shell中的"开始 - >运行"命令启动任何文件.

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

查看文档ShellExecuteExSHELLEXECUTEINFO:

请注意,ShellExecuteEx根据是否启动了新进程,可能会也可能不会返回hProcess.这是你所看到的行为.

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

注意:由于您似乎正在启动可执行文件,因此不会hProcess返回任何内容,这有点令人惊讶ShellExecuteEx.不过,如果你想确保获得一个进程句柄,那么使用UseShellExecute = false是正确的.