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

丶灬走出姿态 提交于 2019-12-22 07:59:43

问题


I am developing a C# component for Grasshopper for Rhino. As I am running some pretty heavy iterative analysis I would like to output results continuously to a cmd window just to make sure that the analysis is actually running.

Here's what I tried:

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

I realise that I am missing part, but what is it?


回答1:


Your approach is wrong: You currently don't write to a console window. Instead you created a process by starting cmd.exe and write to the standard input pipe of that process. cmd.exe is not aware of that. It's not the same as typing in a console via your keyboard, and even that can have strange effects.
Imagine you output a new line character, so cmd.exe might try to "execute" what you output before as a command.

The correct way is to invoke AllocConsole. With this call you can create a console window for your process and use it simply via Console.WriteLine().

When you finished your work and logging, you'll eventually need to close and free this console again via FreeConsole.

So import these two native methods:

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

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

And use them in your code:

NativeMethods.AllocConsole();

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

// finished work

NativeMethods.FreeConsole();

Note that FreeConsole() will close the console window, so all your log messages get lost. And a console only has a so large buffer and you can't scroll back to older messages if the leave the buffer.

So it may be a better idea to simply write your log messages into a file that you can analyze later.




回答2:


Create a Console App in Visual Studio. In VS 2017 it looks like this (on the start page):

Console apps open a command console automatically. Then you can write to it with

Console.WriteLine("hello");

The console closes automatically when the program terminates. So make sure to call Console.ReadKey(); at the end, if you want to keep it open.



来源:https://stackoverflow.com/questions/42979805/create-a-cmd-window-and-write-to-it-from-c-sharp-application

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!