在分配控制台之前调用Console.WriteLine

时间:2011-09-24 05:39:36

标签: c# console console.writeline

我最近遇到了我的应用程序出现以下问题:虽然已使用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 个答案:

答案 0 :(得分:12)

首次使用Console.WriteLine时,Console类会创建TextWriter并将其与Console.Out属性相关联。它的方法是使用Win32打开与标准输出文件句柄关联的低级文件句柄。如果标准输出句柄无效,Console.Out将设置为TextWriter.Null,这会丢弃所有输出。

Win32 AllocConsole函数创建并设置标准输出句柄,因此在调用它之后,标准输出句柄要么不同,要么现在有效。在任何一种情况下,Console.Out都已设置为使用标准输出或丢弃所有输出。

要在调用Console.Out后强制重新打开AllocConsole,您可以使用此方法:

答案 1 :(得分:1)

可能是因为Console类的静态构造函数在您第一次调用Console.WriteLine时设置输出流。由于没有附加控制台,因此没有标准输出句柄,因此输出将路由到位桶。当您稍后调用AllocConsole时,Console类中的任何内容都不会被通知控制台现在存在。它没有机会将Console.Out附加到新创建的标准输出句柄。

答案 2 :(得分:0)

流程只能与一个console相关联,因此如果调用流程已有AllocConsole,则function console会失败。 console应用程序已经有console。请参阅here

中的详细信息