【问题标题】:Create a console from within a non-console .NET application从非控制台 .NET 应用程序中创建控制台
【发布时间】:2010-05-21 14:09:01
【问题描述】:

如何从非控制台 .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);
    }
}

【问题讨论】:

    标签: .net console


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你会想要 P/Invoke AllocConsole()。请务必尽早这样做,使用任何控制台方法之前。在 pinvoke.net 上找到声明

      获取控制台的快速方法:项目 + 属性、应用程序选项卡、输出类型 = 控制台应用程序。

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

      【讨论】:

        【解决方案3】:

        您可以使用AttachConsole,如下所述:

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

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

        【讨论】:

        • 这看起来很有希望,但是它创建的控制台窗口没有附加到System.Console.Out
        • 我不知道如何链接那些我很害怕的人。有AllocConsole 方法,但我认为在这种情况下你会遇到同样的问题。
        猜你喜欢
        • 1970-01-01
        • 2010-10-30
        • 2012-06-20
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        • 2015-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多