1

プロセスが別の*.dllファイルで作成されている場合、コンソールアプリケーションからWindowsフォームアプリに出力をリダイレクトするのに問題があります(雑然とした用語を使用しますが、プログラミングは初めてです)。私はこのリンクに出くわしました(そして私は彼の方法を追求するかもしれません)、同様の問題を詳述します:http: //www.codeproject.com/KB/threads/launchprocess.aspx? msg=3087118コンソールから1行を読み取ることができますが、開いたままにする方法は?

つまり、基本的に私の質問は、別のクラス内からストリームリーダーの出力に適切にアクセスする方法です。

以下のコードは、ローカルで呼び出されたときに完全に機能します。

private void exampleErrorRedirection()
    {
        Process proc = new Process();
        proc.StartInfo.FileName = /exampleconsoleapp.exe;
        proc.StartInfo.Arguments = "some arguments that work";
        proc.StartInfo.RedirectStandardError = true;
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.CreateNoWindow = true;
        if (!proc.Start())
        {
            Console.WriteLine("Error starting");
            return;
        }
        StreamReader reader = proc.StandardError;
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            textBoxForStandardError.Text = line;
        }
        proc.Close();
    }

ただし、呼び出されたときに出力を別のクラスからリダイレクトできるようにしたい。Atmコンソールから最初の行しか取得できず、更新されません。

private void exampleErrorRedirection()
    {

        exampleDLLFile.startProc ConsoleApp new exampleDLLFile.startProc();

        ConsoleApp.Run();

        while (convert.line != null)
        {
            textBoxForStandardError.Text = ConsoleApp.line;
        }
}

クラスには次のようなメソッドが含まれています。

public class convertFile
{

    public string line;

    public void Run()
    {
        Process proc = new Process();
        proc.StartInfo.FileName = /exampleconsoleapp.exe;
        proc.StartInfo.Arguments = "some arguments that work";
        proc.StartInfo.RedirectStandardError = true;
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.CreateNoWindow = true;

        if (!proc.Start())
        {
            Console.WriteLine("Error starting");

        }

        StreamReader reader = proc.StandardError;
        while ((line = reader.ReadLine()) != null)
        {
            line = reader.ReadLine();
        }

        proc.Close();

    }
}
4

1 に答える 1

2

DataReceivedEventHandlerイベントに を追加する必要がありますProcess.ErrorDataReceived

// process is Process
process.UseShellExecute = false;
process.RedirectStandardError = true;
process.ErrorDataReceived += DataReceived;
process.Start();
process.BeginErrorReadLine(); // start asynchronous error read
.
.
.
process.CancelErrorRead();

void DataReceived(object sender, DataReceivedEventArgs e) {
    // e.Data is line of redirected standard error
}
于 2010-01-09T19:21:05.647 に答える