在分配控制台之前调用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.WriteLineConsole类会创建一个TextWriter并将其与Console.Out属性关联。 它的方式是使用Win32打开与标准输出文件句柄相关联的低级文件句柄。 如果标准输出句柄无效,则Console.Out设置为TextWriter.Null ,它会丢弃所有输出。

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

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

  • Console.OpenStandardOutput

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

进程只能与一个console关联,因此如果调用进程已有console ,则AllocConsole function失败。 console应用程序已经有了console 。 在这里查看详细信息