簡體   English   中英

創建一個cmd窗口並從C#應用程序寫入它

[英]Create a cmd window and write to it from C# application

我正在為Rhino的Grasshopper開發一個C#組件。 當我運行一些非常繁重的迭代分析時,我想將結果連續輸出到cmd窗口,以確保分析實際上正在運行。

這是我試過的:

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

我意識到我錯過了一部分,但它是什么?

您的方法是錯誤的:您當前沒有寫入控制台窗口。 相反,您通過啟動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()關閉控制台窗口,因此所有日志消息都會丟失。 並且控制台只有一個如此大的緩沖區,如果離開緩沖區,則無法滾動回較舊的消息。

因此,將日志消息簡單地寫入您可以在以后分析的文件中可能是一個更好的主意。

在Visual Studio中創建控制台應用程序。 在VS 2017中它看起來像這樣(在開始頁面上):

在此輸入圖像描述

控制台應用程序自動打開命令控制台 然后你可以寫信給它

Console.WriteLine("hello");

程序終止時控制台自動關閉。 所以一定要調用Console.ReadKey(); 最后,如果你想保持開放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM