7

我最近在我的应用程序中遇到了以下问题:它没有显示任何控制台输出,尽管控制台已通过使用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

所以我的问题是:为什么会发生这种情况?我没有看到任何例外(尽管我想他们在那里)。

4

3 回答 3

12

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

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

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

于 2011-09-24T06:00:16.390 回答
1

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

于 2011-09-24T05:51:14.340 回答
0

一个进程只能与一个关联console,因此AllocConsole function如果调用进程已经有一个console. 并且该console应用程序已经具有console. 在此处查看详细信息

于 2011-09-24T05:51:47.600 回答