使用STDOUT打印语句将控制台附加到C# Windows应用程序

4

我有一个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("文本"); 成功向控制台写入文本,但如果我使用 Console.Error.WriteLine("文本"),该行不会作为标准输出 (STDOUT) 或标准错误 (STDERR) 发送到控制台。

在本地运行应用程序时,这不是什么大问题,但在构建服务器上运行时,应用程序返回的记录不被注册。目前,我通过创建一个补充日志文件来解决这个问题,在我的应用程序完成运行后,我会使用 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" 时,它会自动运行。 - Hans Passant
将其构建为控制台应用程序而不是 Windows 应用程序。 - Code Name Jack
1个回答

1

感谢您的帮助!这个答案与get-the-handle-and-write-to-the-console-that-launched-our-process结合起来解决了我的问题。 - Ben W
我假设“按照你的期望表现”是指交互式CMD shell(而不是批处理脚本)只会等待控制台应用程序退出。它不会等待GUI应用程序。如果一个GUI子进程连接到shell的控制台,将日志消息写入控制台可能还可以(但会很混乱),但同时从控制台输入缓冲区读取数据会令人困惑。 - Eryk Sun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接