我最近遇到了我的应用程序出现以下问题:虽然已使用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
所以我的问题是:为什么会这样?我没有看到任何例外(虽然我认为他们在那里)。
答案 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