没有控制台时如何将内容写入标准输出

3

当在控制台应用程序或已连接控制台的窗口应用程序中使用Console.Write*时,它的表现与预期一致。

但是,如果我创建一个没有控制台的应用程序,并从命令行运行它,则它的输出不会如预期那样显示。它似乎异步启动应用程序,因为当程序仍在运行时提示符重新出现。

我该如何以这样的方式输出文本,使文本输出将显示在已连接的控制台或运行它的命令提示符中?或者,我该如何以不同的方式运行应用程序,以便正确等待并捕获预期的输出?


1
如果它不是控制台应用程序,那么从控制台窗口启动它将产生与从控制台窗口启动任何其他Windows应用程序相同的效果。与从“运行...”对话框中启动它的效果相同。如果您想要一个控制台应用程序,您需要相应地更改您的项目。 - Cody Gray
2个回答

3
考虑使用日志框架,而不是仅仅依赖控制台。日志框架提供了各种消耗日志的方式,这样你就可以决定哪种方式最适合你,而无需改动代码。
例如,如果你正在使用一个设置为将日志消息输出到控制台的日志框架,你只需更改一个配置选项即可将其输出到文件中,你可以使用类似Baretail的工具来查看文件中的日志,即使你没有打开控制台也可以。或者你可以轻松地更改配置以将其输出到System.Diagnostics.Debug,这样它就会出现在Visual Studio输出窗口中。

你甚至不需要任何复杂的东西。你可以直接使用内置的Trace类,并通过TraceListener进行挂钩。当然,也有一些非常好的日志记录框架... :-) - Cody Gray
1
@CodyGray:有趣的是,使用日志框架并不一定复杂,而且与使用Console、Debug或Trace相比,它所带来的未来保障是如此有益。作为一个经验法则,我建议在处理比LINQPad脚本更复杂的任何事情时都使用日志框架。 - StriplingWarrior

0
如果您只想在Visual Studio中显示调试输出,请使用System.Diagnostics.Debug.WriteLine()在应用程序运行时输出到“Immediate”窗口。将其包装在“IF”预编译器指令中,以便在编译为非调试构建时不会发生。如果当前构建目标没有设置“DEBUG”标志(例如默认的“Release”构建目标),则编译器将完全忽略“IF”内部的任何行。
#if DEBUG
    System.Diagnostics.Debug.WriteLine()
#endif

4
在System.Diagnostics.Debug类中的所有方法都带有"[System.Diagnostics.Conditional("DEBUG")]"属性,因此预编译指令是不必要的。 - StriplingWarrior
Console.Stderr.Writeline()不会打印到即时窗口吗? - Peter - Reinstate Monica
@StriplingWarrior 你是正确的。我没有考虑到那个。预编译指令是不必要的。 - Mike U

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