【问题标题】:Attaching Console to C# Windows Application with STDOUT Print Statements使用 STDOUT 打印语句将控制台附加到 C# Windows 应用程序
【发布时间】:2018-08-09 13:04:52
【问题描述】:

我有一个 C# GUI 应用程序,它还支持用于服务器端脚本的命令行模式。我的应用程序关闭输入参数的数量,如果 > 0,则附加父控制台。

[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
private const int ATTACH_PARENT_PROCESS = -1;

[STAThread]
static void Main(string[] args)
{
    bool runningFromConsole = args.Length > 0 && AttachConsole(ATTACH_PARENT_PROCESS);
    if(runningFromConsole)
        // Handle input arguments
    else
        // Launch GUI
}

我能够使用Console.Out.WriteLine("Text"); 成功地将文本写入控制台,但该行不会作为 STDOUT(或 STDERR,如果我使用 Console.Error.WriteLine("Text"))发送到控制台。

在本地运行我的应用程序时,这没什么大不了的,但是在构建服务器上运行时,应用程序返回不注册。现在,我正在通过创建一个补充日志文件来解决这个问题,一旦我的应用程序完成运行,我将 type application.log 到控制台。

有没有办法将打印到控制台的强制文本作为 STDOUT/STDERR 发送?

【问题讨论】:

  • I/O 重定向需要您创建一个控制台模式应用程序,它不能用于 gui 应用程序并且 AttachConsole 为时已晚。另请注意,Console.Write 输出与 cmd.exe 输出混合在一起,并且 Console.Read 不可靠,因为 cmd.exe 也在读取。 Cmd.exe 不知道它需要阻止,直到 app.exe 完成运行。考虑创建一个基本控制台模式应用程序,该应用程序在没有参数时仅启动 app.exe。您甚至可以将其重命名为 app.com,以便当用户在命令行中键入“app /foo /bar”时它会自动运行。
  • 将其构建为控制台应用程序而不是 Windows 应用程序。

标签: c# windows stdout


【解决方案1】:

AttachConsole 的行为与您期望的不太一样,您需要经常做的是 AllocConsole 并更改您的 stdio 句柄以使用该控制台。

我可以验证这个问题的公认答案在这种情况下有效,因为我已经使用过它:No console output when using AllocConsole and target architecture x86

【讨论】:

  • 感谢您的帮助!这个答案结合get-the-handle-and-write-to-the-console-that-launched-our-process 解决了我的问题
  • 我认为“按照你期望的方式行事”是指交互式 CMD shell(不是批处理脚本)如何只等待控制台应用程序退出。它不会等待 GUI 应用程序。如果一个 GUI 子节点连接到 shell 的控制台,将日志消息写入控制台可能没问题(但很麻烦),但尝试与 shell 同时从控制台输入缓冲区读取会令人困惑。跨度>
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多