我有一个可执行文件,可以从命令提示符立即运行,但在使用System.Diagnostics.Process生成时似乎永远不会返回:
基本上,我正在围绕Accurev CLI界面编写.NET库包装器,因此每个方法调用都会生成CLI进程以执行命令。
这对除了一个命令之外的所有命令都很有用:
accurev.exe show depots
但是,当从控制台运行它时,运行正常,当我使用.net进程调用它时,它会挂起...我使用的进程生成代码是:
public static string ExecuteCommand(string command)
{
Process p = createProcess(command);
p.Start();
p.WaitForExit();
// Accurev writes to the error stream if ExitCode is non zero.
if (p.ExitCode != 0)
{
string error = p.StandardError.ReadToEnd();
Log.Write(command + " failed..." + error);
throw new AccurevException(error);
}
else
{
return p.StandardOutput.ReadToEnd();
}
}
/// Creates Accurev Process
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
private static Process createProcess(string command)
{
Log.Write("Executing Command: " + command);
ProcessStartInfo startInfo = new ProcessStartInfo();
Process p = new Process();
startInfo.CreateNoWindow = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.Arguments = command;
startInfo.FileName = _accurev;
p.StartInfo = startInfo;
return p;
}
它挂在p.WaitForExit()。
有什么建议吗?
编辑:解决了!
如果输出缓冲区溢出,.NET进程挂起,我切换到使用异步读取方法,一切正常:
public static string ExecuteCommand(string command)
{
StringBuilder outputData = new StringBuilder();
Process p = createProcess(command);
p.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
{
outputData.AppendLine(e.Data);
};
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();
// Accurev writes to the error stream if ExitCode is non zero.
if (p.ExitCode != 0)
{
string error = p.StandardError.ReadToEnd();
Log.Write(command + " failed..." + error);
throw new AccurevException(error);
}
else
{
return outputData.ToString();
}
}
答案 0 :(得分:2)
正在寻求投入?特别是,我注意到你正在重定向stdin,但没有关闭它 - 所以如果从stdin读取它将会挂起。
答案 1 :(得分:1)
在WaitForExit()执行时,生成的进程是否仍然存在?你可以附加一个调试器吗?
答案 2 :(得分:-2)
尝试使用以下内容替换WaitForExit():
while (!p.WaitForExit(100))
Console.Write(".");
要尝试的另一件事是将UseShellExecute设置为true,并观察控制台窗口的生成。有关该参数的复杂性,请参阅此页面:http://blogs.msdn.com/jmstall/archive/2006/09/28/CreateNoWindow.aspx