Я работаю над пользовательской IDE на C# для языка сценариев, и у меня возникла проблема.
Я пытаюсь запустить процесс компиляции (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;
}
}
myProcess.OutputDataReceived
иmyProcess.ErrorDataReceived
) намного надежнее, чем использование методов синхронного чтения. - person psubsee2003   schedule 02.01.2013