[英]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()
將關閉控制台窗口,因此所有日志消息都會丟失。 並且控制台只有一個如此大的緩沖區,如果離開緩沖區,則無法滾動回較舊的消息。
因此,將日志消息簡單地寫入您可以在以后分析的文件中可能是一個更好的主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.