7

スクリプト言語用に 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;
            }
        }
4

3 に答える 3

6

標準エラー ストリームもリダイレクトする必要があります。

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);
        }
    }

これには明らかにバリエーションがありますが、これで始めることができます。

于 2013-01-02T01:01:38.987 に答える
1

過去に生成されたプロセスからの未加工の出力/エラー ストリームを処理する際にいくつかの散発的な問題に気付きました。そのため、通常はイベントを介してキャプチャされた出力を処理します。

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(); 
于 2013-01-02T01:19:52.163 に答える
1

私は pawnCC アプリケーションを持っていないので試すことはできませんが、コマンド プロンプトとは別に、デバッグ情報の冗長性を外部アプリケーションに制限しているようです。

cmd を使用して pawncc.exe を生成してみてください:

"cmd.exe \c CommandParameterToLaunchPawnCCwithArguments"
于 2013-01-02T01:22:10.497 に答える