2017-03-23 12 views
2

Rhapsody 용 Grasshopper 용 C# 구성 요소를 개발 중입니다. 꽤 많은 반복적 인 분석을 실행하면서 분석 결과가 실제로 실행되는지 확인하기 위해 결과를 cmd 창에 지속적으로 출력하고 싶습니다.cmd 창을 만들어 C# 응용 프로그램에서 작성합니다.

는 여기에 내가 시도 내용은 다음과 같습니다

using System.Diagnostics; 


Result results = new Result(); 
Process cmd = new Process(); 
cmd.StartInfo.FileName = "cmd.exe"; 
cmd.StartInfo.RedirectStandardInput = true; 
cmd.StartInfo.RedirectStandardOutput = true; 
cmd.StartInfo.CreateNoWindow = false; 
cmd.StartInfo.UseShellExecute = false; 
cmd.Start(); 

do { 
    results = RunHeavyOperation(results); 
    cmd.StandardInput.WriteLine("echo " + results.usefulInfo); 
} while (!results.conditionForEnd); 

cmd.WaitForExit(); 

Result RunHeavyOperation(Result previousResults) { 
    Result res = doHeavyStuff(previousResults); 
    return res; 
} 

가 나는 부분을 놓치고 실현, 그러나 그것은 무엇인가?

+0

, 나는 일시적으로'System.Diagnostics.Debug.Write (results.usefulInformation)를 사용하여 문제를 해결. –

답변

5

접근 방법이 잘못되었습니다. 현재 콘솔 창에 쓰지 않습니다. 대신 cmd.exe을 시작하여 프로세스를 만들고의 표준 입력 파이프에 씁니다. cmd.exe은이를 인식하지 못합니다. 키보드를 통해 콘솔에 타이핑하는 것과 같지 않으며 이상한 효과가있을 수도 있습니다.
새 줄 문자를 출력한다고 가정하면 cmd.exe은 전에 출력 한 내용을 명령으로 "실행"하려고 할 수 있습니다.

올바른 방법은 AllocConsole입니다. 이 호출을 통해 프로세스에 대한 콘솔 창을 만들고 간단하게 Console.WriteLine()을 통해 사용할 수 있습니다.

작업 및 로깅을 마치면 결국이 콘솔을 닫고 다시 FreeConsole을 통해 해제해야합니다.

internal sealed class NativeMethods 
{ 
    [DllImport("kernel32.dll")] 
    public static extern bool AllocConsole(); 

    [DllImport("kernel32.dll")] 
    public static extern bool FreeConsole(); 
} 

을 그리고 당신의 코드에서 사용 :

그래서이 두 가지 기본 방법을 가져

NativeMethods.AllocConsole(); 

// start work 
Console.WriteLine("log messages..."); 

// finished work 

NativeMethods.FreeConsole(); 

참고 FreeConsole() 것이다 가까운 콘솔 창, 그래서 모든 로그 메시지가 손실됩니다. 콘솔에는 버퍼가 너무 커서 버퍼를 남겨두면 이전 메시지로 스크롤 할 수 없습니다.

그래서 단순히 나중에 분석 할 수있는 파일에 로그 메시지를 기록하는 더 좋은 생각이 될 수 있습니다. `하지만, 응용 프로그램이 생산을 입력하면이 작동하지 않습니다, 기록을 위해

+0

예, 이것이 내가 찾고있는 것입니다. 감사! –

+1

winforms 앱에서이 작업을 수행 할 수 있습니까? 콘솔을 열 수는 있지만 콘솔에 아무것도 쓰이지 않습니다! –

+0

@ OlivierJacot-Descombes 네, 할 수 있습니다. 다시 테스트 했으니까요. –

1

Visual Studio에서 콘솔 응용 프로그램을 만듭니다. VS 2017에서 그것은 (시작 페이지)과 같습니다

enter image description here

콘솔 응용 프로그램이 자동으로 명령 콘솔을 엽니 다. 그러면 쓸 수 있습니다

Console.WriteLine("hello"); 

프로그램이 종료되면 콘솔이 자동으로 닫힙니다. 따라서 열린 상태로 유지하려면 끝에 Console.ReadKey();으로 전화하십시오.

+0

그게 다 좋고 좋지만 그 앱은 이미 개발 단계에 있습니다. 기존 앱을 콘솔 앱으로 마이그레이션하는 것은 쉬운 일입니까? –

+2

http://stackoverflow.com/questions/3427026/convert-winform-app-to-console-app –

+1

그것은 당신이 이미 윈폼 또는 WPF 응용 프로그램을 만들어 이미 UI를 만들거나 당신은 단지 비즈니스 로직을 작성 여부를 여부 따라 달라집니다. 후자의 경우에는 변환해야 할 것이 없습니다.물론 응용 프로그램은 콘솔과 WinForms 또는 WPF 응용 프로그램이 될 수 없습니다. –