我有一个包含此代码的 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
类,系统可以使用 CreateProcess
或 ShellExecuteEx
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/