문제

작업을 수행하기 위해 별도의 프로그램을 호출 해야하는 Windows Forms 응용 프로그램을 개발하고 있습니다. 이 프로그램은 콘솔 애플리케이션이며 콘솔에서 내 프로그램의 텍스트 상자로 표준 출력을 리디렉션해야합니다.

응용 프로그램에서 프로그램을 실행하는 데 아무런 문제가 없지만 출력을 응용 프로그램으로 리디렉션하는 방법을 모르겠습니다. 프로그램이 이벤트를 사용하여 실행하는 동안 출력을 캡처해야합니다.

콘솔 프로그램은 응용 프로그램이 중지되고 텍스트가 임의의 간격으로 지속적으로 변경 될 때까지 실행을 중단하지는 않습니다. 제가 시도하는 것은 콘솔의 훅 출력을 통해 이벤트 핸들러를 트리거하여 텍스트 상자를 업데이트하는 데 사용할 수 있습니다.

C#을 사용하여 프로그램을 코딩하고 개발을 위해 .NET 프레임 워크를 사용하고 있습니다. 원래 응용 프로그램은 .NET 프로그램이 아닙니다.

편집 : 여기에 내가하려는 일의 예제 코드가 있습니다. 최종 앱에서는 Console.Writeline을 코드로 바꾸어 텍스트 상자를 업데이트합니다. 이벤트 핸들러에서 중단 점을 설정하려고했지만 도달하지도 않았습니다.

    void Method()
    {
        var p = new Process();
        var path = @"C:\ConsoleApp.exe";

        p.StartInfo.FileName = path;
        p.StartInfo.UseShellExecute = false;
        p.OutputDataReceived += p_OutputDataReceived;

        p.Start();
    }

    static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Console.WriteLine(">>> {0}", e.Data);
    }
도움이 되었습니까?

해결책

이것은 나를 위해 작동합니다 :

void RunWithRedirect(string cmdPath)
{
    var proc = new Process();
    proc.StartInfo.FileName = cmdPath;

    // set up output redirection
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;    
    proc.EnableRaisingEvents = true;
    proc.StartInfo.CreateNoWindow = true;
    // see below for output handler
    proc.ErrorDataReceived += proc_DataReceived;
    proc.OutputDataReceived += proc_DataReceived;

    proc.Start();

    proc.BeginErrorReadLine();
    proc.BeginOutputReadLine();

    proc.WaitForExit();
}

void proc_DataReceived(object sender, DataReceivedEventArgs e)
{
    // output will be in string e.Data
}

다른 팁

다음 코드를 사용할 수 있습니다

        MemoryStream mem = new MemoryStream(1000);
        StreamWriter writer = new StreamWriter(mem);
        Console.SetOut(writer);

        Assembly assembly = Assembly.LoadFrom(@"C:\ConsoleApp.exe");
        assembly.EntryPoint.Invoke(null, null);
        writer.Close();

        string s = Encoding.Default.GetString(mem.ToArray());
        mem.Close();

나는 많은 도우미 방법을 추가했다 O2 플랫폼 (오픈 소스 프로젝트) 콘솔 출력 및 입력을 통해 다른 프로세스와 쉽게 스크립트 할 수있는 (참조 http://code.google.com/p/o2platform/source/browse/trunk/o2_scripts/apis/windows/cmdexe/cmdeveapi.cs)

또한 현재 프로세스의 콘솔 출력 (기존 제어 또는 팝업 창)을 볼 수있는 API 일 수도 있습니다. 자세한 내용은이 블로그 게시물을 참조하십시오. http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-console output/ (이 블로그에는 새로운 프로세스의 콘솔 출력을 소비하는 방법에 대한 세부 정보도 포함되어 있습니다)

시간을 절약하는 그의 대답에 대해 Marc Maxham에게 감사드립니다!

모든 거래의 Jon이 알아 차리고 UseShellExecute IO 스트림을 리디렉션하려면 false로 설정해야합니다. Start() 전화를 던진다 InvalidOperationException.

다음은 코드를 수정합니다 txtOut wpf readonly textbox입니다

void RunWithRedirect(string cmdargs)
{
    var proc = new Process()
    {
        StartInfo = new ProcessStartInfo("cmd.exe", "/k " + cmdargs)
        {
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = true
        },
        EnableRaisingEvents = true
    };

    // see below for output handler
    proc.ErrorDataReceived += proc_DataReceived;
    proc.OutputDataReceived += proc_DataReceived;
    proc.Start();

    proc.BeginErrorReadLine();
    proc.BeginOutputReadLine();

    proc.WaitForExit();
}

void proc_DataReceived(object sender, DataReceivedEventArgs e)
{
    if (e.Data != null)
        Dispatcher.BeginInvoke(new Action( () => txtOut.Text += (Environment.NewLine + e.Data) ));
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top