在分配控制台之前调用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
所以我的问题是:为什么会发生这种情况? 我没有看到任何例外(虽然我认为他们在那里)。
第一次使用Console.WriteLine
, Console
类会创建一个TextWriter
并将其与Console.Out
属性关联。 它的方式是使用Win32打开与标准输出文件句柄相关联的低级文件句柄。 如果标准输出句柄无效,则Console.Out
设置为TextWriter.Null
,它会丢弃所有输出。
Win32 AllocConsole
函数创建并设置标准输出句柄,因此在调用它之后,标准输出句柄要么不同,要么现在有效。 在任何一种情况下, Console.Out
都已设置为使用旧标准输出或丢弃所有输出。
要在调用AllocConsole
后强制重新打开Console.Out
,可以使用此方法:
-
Console.OpenStandardOutput
可能是因为Console
类的静态构造函数在您第一次调用Console.WriteLine
时设置输出流。 由于没有附加控制台,因此没有标准输出句柄,因此输出将路由到位桶。 当您稍后调用AllocConsole
, Console
类中的任何内容都不会通知控制台现在存在。 它没有机会将Console.Out
附加到新创建的标准输出句柄。
进程只能与一个console
关联,因此如果调用进程已有console
,则AllocConsole
function
失败。 console
应用程序已经有了console
。 在这里查看详细信息