读取另一个正在运行的应用程序

我正在使用C#中的自定义IDE编写脚本语言,我遇到了问题。

我正在尝试启动编译器进程(pawncc.exe)并将参数传递给它。 我已经做到了,现在我遇到了问题。 当我想显示编译器应用程序的输出时,它只显示它的某些部分。 它应该输出( 从命令提示符获取 ):

Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase newGM.pwn(0) : fatal error 100: cannot read from file: "includes/main_include.inc" Compilation aborted. 1 Error. 

但事实并非如此。 它输出( 在应用程序中,使用相同的命令/参数 ):

 Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase 1 Error. 

我只是不明白! 这真的很奇怪。 这可能是一件简单的事情,但我一直在看它,现在研究几个小时! 这是我的代码:

  public Form3(string path) { InitializeComponent(); this._path = path; Process myProcess = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo("pawncc.exe"); startInfo.CreateNoWindow = true; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.Arguments = path + " -r -d2"; myProcess.StartInfo = startInfo; myProcess.Start(); while (true) { string myString; byte[] buffer = new byte[512]; var ar = myProcess.StandardOutput.BaseStream.BeginRead(buffer, 0, 512, null, null); ar.AsyncWaitHandle.WaitOne(); var bytesRead = myProcess.StandardOutput.BaseStream.EndRead(ar); if (bytesRead > 0) { myString = Encoding.ASCII.GetString(buffer, 0, bytesRead); } else { myProcess.WaitForExit(); break; } richTextBox1.Text = myString; } } 

!!编辑:

它对这段代码做了同样的事情:

  public Form3(string path) { InitializeComponent(); this._path = path; Process myProcess = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo("pawncc.exe"); startInfo.CreateNoWindow = true; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; startInfo.Arguments = path + " -r -d2"; myProcess.StartInfo = startInfo; myProcess.Start(); using (StreamReader reader = myProcess.StandardOutput) { string result = reader.ReadToEnd(); richTextBox1.Text = result; } } 

您还需要重定向标准错误流:

 startInfo.RedirectStandardError = true; 

编辑:我刚刚查看了代码并发现您只是只读StandardOutput流。

我通常使用进程上的DataReceived事件监视标准和错误输出流的进程,并将结果添加到stringbuilder中,然后将StringBuilder内容存储在UI元素中:

  private static System.Text.StringBuilder m_sbText; public Form3(string path) { InitializeComponent(); this._path = path; Process myProcess = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo("pawncc.exe"); startInfo.CreateNoWindow = true; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; startInfo.Arguments = path + " -r -d2"; myProcess.StartInfo = startInfo; m_sbText = new System.Text.StringBuilder(1000); myProcess.OutputDataReceived += ProcessDataHandler; myProcess.ErrorDataReceived += ProcessDataHandler; myProcess.Start(); myProcess.BeginOutputReadLine(); myProcess.BeginErrorReadLine(); while (!myProcess.HasExited) { System.Threading.Thread.Sleep(500); System.Windows.Forms.Application.DoEvents(); } RichTextBox1.Text = m_sbText.ToString(); } private static void ProcessDataHandler(object sendingProcess, DataReceivedEventArgs outLine) { // Collect the net view command output. if (!String.IsNullOrEmpty(outLine.Data)) { // Add the text to the collected output. m_sbText.AppendLine(outLine.Data); } } 

这有明显的变化,但这应该让你开始。

我没有pawnCC应用程序,所以我不能尝试,但它似乎限制调试信息到外部应用程序的详细程度 – 除了命令提示符。

你能尝试通过cmd生成pawncc.exe:

 "cmd.exe \c CommandParameterToLaunchPawnCCwithArguments" 

我在处理过去生成的进程中的原始输出/错误流时发现了一些零星的问题,因此我通常会通过事件处理捕获的输出:

 Process myProcess = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo("pawncc.exe"); startInfo.CreateNoWindow = true; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; startInfo.Arguments = path + " -r -d2"; myProcess.EnableRaisingEvents = true; myProcess.OutputDataReceived += OnOutputDataReceived; myProcess.ErrorDataReceived += OnErrorDataReceived; myProcess.StartInfo = startInfo; myProcess.Start(); myProcess.BeginOutputReadLine(); myProcess.BeginErrorReadLine();