【问题标题】:Calling Console.WriteLine before allocating the console在分配控制台之前调用 Console.WriteLine
【发布时间】:2011-09-24 05:39:35
【问题描述】:

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

所以我的问题是:为什么会发生这种情况?我没有看到任何异常(尽管我认为它们存在)。

【问题讨论】:

  • 现在已经解释了它发生的原因,我希望有人能解释如何处理它。是不是使用的任何第三方库都可以写入控制台并为所有其他人搞砸事情?正确的解决方案是否只有在做任何其他事情之前尽早决定并AllocConsole
  • @Hemal 我使用了 Rick 描述的一种方法 - 在 AllocConsole 之后调用 Console.OpenStandartOutput()。这样我可以确定至少在AllocConsole 之后写入的所有输出都会显示出来。

标签: c# console console.writeline


【解决方案1】:

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

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

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

【讨论】:

  • 哇。万一其他人看到这一点,似乎这可能会发生,就好像这是一个竞争条件——分配,然后写入控制台并什么也得不到。另外,我必须编写 Console.SetOut(new StreamWriter(Console.OpenStandardOutput()); 单独调用 Console.OpenStandardOutput() 没有帮助。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    一个进程只能与一个console 关联,因此如果调用进程已经有一个console,则AllocConsole function 会失败。而console 应用程序已经拥有console。详情见here

    【讨论】:

    • 我的应用程序编译为 GUI 应用程序,但在使用命令行参数运行时使用控制台。
    • 你怎么知道这是一个控制台应用程序?它很可能是一个带有控制台的 Windows 应用程序。 编辑:告诉你。
    • Console.WriteLine 写在 AllocConsole 上方,所以我认为是。无论如何我为此道歉:) GetLastError() 在这种情况下可能会告诉你一些事情
    猜你喜欢
    • 2012-02-03
    • 2011-08-08
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多