Calling Console.WriteLine before allocating the console
I've recently encountered the following problem with my application: it didn't show any console output, though the console had been allocated by using AllocConsole
. I managed to figur开发者_如何学JAVAe out soon that it was caused by an attempt (hidden deeply in code) to write to the console before the AllocConsole
was called. So it looked like this:
Console.WriteLine("Foo"); // no console allocated yet
AllocConsole(); // console window appears
Console.WriteLine("Bar"); // expecting "Bar" in the console, but the console is blank
So my question is: why does this happen? I don't see any exceptions (though I suppose they are there).
The first time you use Console.WriteLine
, the Console
class creates a TextWriter
and associates it with the Console.Out
property. The way it does this is to use Win32 to open the low-level file handle associated with the standard output file handle. If the standard output handle is invalid, Console.Out
is set to TextWriter.Null
, which discards all output.
The Win32 AllocConsole
function, creates and sets the standard output handle so after calling it the standard output handle is either different or now valid. In either case, Console.Out
has already been set either to use the old standard output or to discard all output.
To force a re-open of Console.Out
after calling AllocConsole
, you can use this method:
Console.OpenStandardOutput
Probably because the static constructor of the Console
class sets up the output stream the first time you call Console.WriteLine
. Since there's no console attached, and therefore no standard output handle, output gets routed to the bit bucket. And when you call AllocConsole
later, nothing in the Console
class is notified that a console now exists. It doesn't have the opportunity to attach Console.Out
to the newly created standard output handle.
A process can be associated with only one console
, so the AllocConsole
function
fails if the calling process already has a console
. And the console
application is already has the console
. See details in here
精彩评论