在非控制台.NET应用程序中创建控制台

时间:2010-05-21 14:09:02

标签: .net console

如何从非控制台.NET应用程序中打开控制台窗口(因此我在调试时有System.Console.Out和朋友的位置?)


在C ++中,这可以使用各种Win32 API来完成:

/*
   EnsureConsoleExists() will create a console
   window and attach stdout (and friends) to it.

   Can be useful when debugging.
*/

FILE* const CreateConsoleStream(const DWORD stdHandle, const char* const mode)
{
    const HANDLE outputHandle = ::GetStdHandle(stdHandle);
    assert(outputHandle != 0);
    const int outputFileDescriptor = _open_osfhandle(reinterpret_cast<intptr_t>(outputHandle), _O_TEXT);
    assert(outputFileDescriptor != -1);
    FILE* const outputStream = _fdopen(outputFileDescriptor, mode);
    assert(outputStream != 0);
    return outputStream;
}

void EnsureConsoleExists()
{
    const bool haveCreatedConsole = (::AllocConsole() != 0);
    if (haveCreatedConsole) {
        /*
            If we didn't manage to create the console then chances are
            that stdout is already going to a console window.
        */
        *stderr = *CreateConsoleStream(STD_ERROR_HANDLE, "w");
        *stdout = *CreateConsoleStream(STD_OUTPUT_HANDLE, "w");
        *stdin = *CreateConsoleStream(STD_INPUT_HANDLE, "r");
        std::ios::sync_with_stdio(false);

        const HANDLE consoleHandle = ::GetStdHandle(STD_OUTPUT_HANDLE);
        assert(consoleHandle != NULL && consoleHandle != INVALID_HANDLE_VALUE);

        CONSOLE_SCREEN_BUFFER_INFO info;
        BOOL result = ::GetConsoleScreenBufferInfo(consoleHandle, &info);
        assert(result != 0);

        COORD size;
        size.X = info.dwSize.X;
        size.Y = 30000;
        result = ::SetConsoleScreenBufferSize(consoleHandle, size);
        assert(result != 0);
    }
}

3 个答案:

答案 0 :(得分:2)

如果它纯粹用于调试,请使用Debug class并将所有内容发送到Visual Studio中的“调试输出”窗口。

答案 1 :(得分:2)

你想要P / Invoke AllocConsole()。请务必尽早之前使用任何Console方法。在pinvoke.net上找到声明

获取控制台的一种非常快捷的方法:Project + Properties,Application选项卡,Output type = Console Application。

对于提供诊断输出的更永久的方法,您确实希望使用Trace类。它非常灵活,您可以使用app.exe.config文件来确定跟踪输出的位置。查看TraceListener类的MSDN Library文档。

答案 2 :(得分:1)

您可以按照此处所述使用AttachConsole

http://www.pinvoke.net/default.aspx/kernel32.attachconsole

但正如Austin所说,如果你在调试器中进行调试,我建议改为使用Debug类。