为什么ConsoleTraceListener没有向控制台输出信息?

3

经常会遇到.NET Framework中的项目,这些项目在如何使用其功能方面缺乏或没有示例代码。在其他情况下,虽然有很多示例,但似乎没有一个按照规定的方式工作。

例如:System.Diagnostics.ConsoleTraceListener类。

根据我所读和看到的每个代码示例,当我执行以下操作时:

ConsoleTraceListner listener = new ConsoleTraceListener();
listener.WriteLine("Yo");

我应该看到一个控制台窗口弹出,显示"Yo"。但是,与期望的输出不同,它将"Yo"写入了Visual Studio Output中,就像普通的Trace/Debug消息一样。
我尝试了各种例子,包括配置文件设置适当的监听器,将监听器添加到Trace.Listeners集合中,使用自定义ConsoleTraceListener类型等等。我甚至只是编译为发布版本并运行可执行文件(什么也没发生)。
我错过了什么?
2个回答

5
回复你对Orion Adrian的回答的评论... ConsoleTraceListenter或任何TraceListener的要点不是直接调用它 - 而是将其添加到跟踪侦听器集合中,以便您的其余代码只需调用Trace.Write等方法。例如:
using System;
using System.Diagnostics;

class Test
{
    static void Main()
    {
        ConsoleTraceListener listener = new ConsoleTraceListener();
        Trace.Listeners.Add(listener);

        DoSomething();

        Trace.Flush();
    }

    static void DoSomething()
    {
        DoSomethingElse();
    }

    static void DoSomethingElse()
    {
        // We don't want to have to pass all our logging
        // baggage down this far
        Trace.WriteLine("In DoSomethingElse");
    }
}

定义TRACE并编译,即可将简单日志记录到控制台。个人更喜欢使用一些更具"威力"的日志记录工具,如log4net,但跟踪是一个不错的开始。


1
在上述情况下,您可以拥有多个Trace侦听器,一个用于ConsoleTraceListener,可能还有一个用于EventLogTraceListener。 - user117499
@Jon,非常感谢您的建议。但是我已经几乎逐字地写了您所写的内容。我的评论如上所述:“我尝试了我在Google上搜索到的每个示例,包括...将侦听器添加到Trace.Listeners集合中...”。但它仍然不能按照我期望的方式工作。我还没有找到正确的组合来实际呈现带有文本的控制台。 - TheHolyTerrah
@Boydski:我只是在回答你对Orion的评论,解释为什么首先要使用跟踪侦听器的好处。 - Jon Skeet

4
即使按照上述建议定义了TRACE,控制台跟踪信息也只会在可执行文件以/target:exe作为控制台可执行文件创建时可见。如果它是使用/target:winexe创建的,则不会有控制台可用,因此无法从ConsoleTraceListener输出跟踪信息。

2
这是唯一正确的答案。ConsoleTraceListener 应该仍然写入标准输出,但它不会为您打开控制台窗口。如果您无法将应用程序更改为控制台应用程序,则可以使用一些 Win32 API 函数(例如 AllocConsole)来使控制台窗口出现。 - Vivelin

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