Вызов Console.WriteLine перед выделением консоли - PullRequest
7 голосов
/ 24 сентября 2011

Недавно я столкнулся со следующей проблемой, связанной с моим приложением: оно не показывало вывод консоли, хотя консоль была выделена с помощью AllocConsole.Вскоре мне удалось выяснить, что это было вызвано попыткой (глубоко скрытой в коде) выполнить запись в консоль до вызова AllocConsole.Так это выглядело так:

Console.WriteLine("Foo"); // no console allocated yet
AllocConsole();           // console window appears
Console.WriteLine("Bar"); // expecting "Bar" in the console, but the console is blank

Итак, мой вопрос: почему это происходит?Я не вижу никаких исключений (хотя я предполагаю, что они есть).

Ответы [ 3 ]

12 голосов
/ 24 сентября 2011

При первом использовании Console.WriteLine класс Console создает TextWriter и связывает его со свойством Console.Out. Для этого нужно использовать Win32, чтобы открыть дескриптор файла низкого уровня, связанный с дескриптором файла standard output . Если стандартный дескриптор вывода недействителен, Console.Out устанавливается на TextWriter.Null, что отбрасывает все выходные данные.

Функция Win32 AllocConsole создает и устанавливает стандартный дескриптор вывода, поэтому после его вызова стандартный дескриптор вывода либо отличается, либо теперь действует. В любом случае Console.Out уже настроен либо на использование стандартного старого стандартного выхода, либо на сброс всех выходных данных.

Чтобы принудительно повторно открыть Console.Out после вызова AllocConsole, вы можете использовать этот метод:

1 голос
/ 24 сентября 2011

Возможно, потому что статический конструктор класса Console устанавливает выходной поток при первом вызове Console.WriteLine. Поскольку консоль не подключена и, следовательно, нет стандартного дескриптора вывода, вывод направляется в область битов. И когда вы вызываете AllocConsole позже, ничего из класса Console не уведомляется о том, что консоль теперь существует. У него нет возможности присоединить Console.Out к вновь созданному стандартному дескриптору вывода.

0 голосов
/ 24 сентября 2011

Процесс может быть связан только с одним console, поэтому AllocConsole function завершается ошибкой, если вызывающий процесс уже имеет console. И приложение console уже имеет console. Подробнее в здесь

...