Создайте консоль из неконсольного приложения .NET - PullRequest
1 голос
/ 21 мая 2010

Как я могу открыть консольное окно из неконсольного приложения .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 ]

2 голосов
/ 21 мая 2010

Вы хотите P / Invoke AllocConsole (). Обязательно сделайте это рано, за до , используя любой из методов Консоли. Найти объявление на pinvoke.net

Очень быстрый способ получить консоль: Проект + Свойства, вкладка Приложения, Тип вывода = Консольное приложение.

Для более постоянного способа предоставления диагностического вывода вы действительно хотите использовать класс Trace. Он очень гибкий, вы можете использовать файл app.exe.config, чтобы определить, куда выводится трассировка. Просмотрите документы библиотеки MSDN для класса TraceListener.

2 голосов
/ 21 мая 2010

Если это чисто для отладки, используйте класс Debug и отправьте все в окно вывода отладки в Visual Studio.

1 голос
/ 21 мая 2010

Вы можете использовать AttachConsole, как описано здесь:

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

Но, как сказал Остин, если вы отлаживаете в отладчике, я бы предложил вместо этого использовать класс Debug.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...