抑制特定DLL的跟踪消息

时间:2013-10-14 04:16:29

标签: c# visual-studio

我正在使用第三方库,它会多次调用该函数:

Trace.WriteLine(string message);

这会使visual studio输出窗口变得混乱,并且难以调试我的应用程序(例如,XAML绑定警告)。

我正试图找到一种方法来阻止来自特定dll的所有跟踪消息从转储到visual studio输出窗口 - 正在编写我自己的TraceListener是唯一的前进路径吗?


我不能让 TraceFilter / EventTypeFilter 为没有类别的字符串消息工作 - 虽然我找不到支持它的文档 - 根据经验:

TraceFilter.ShouldTrace(...)

由以下函数调用(不是完整集):

Trace.WriteLine(string message, string category);
Trace.TraceError(string message);
Trace.WriteLine(object o);

但未被:

调用
Trace.WriteLine(string message);

有谁知道为什么这个调用会避免使用ShouldTrace过滤器?

2 个答案:

答案 0 :(得分:0)

根据ILSpyTrace.WriteLine(string message)被声明为抽象,需要被派生类覆盖:

public abstract void WriteLine(string message);

您提及的所有其他方法都会检查ShouldTrace并最终调用Trace.WriteLine(string message)消息。

E.g:

public virtual void WriteLine(string message, string category)
{
    if (Filter != null && 
        !Filter.ShouldTrace(null, "", TraceEventType.Verbose, 0, message))
    {
        return;
    }
    if (category == null)
    {
        WriteLine(message);
        return;
    }
    WriteLine(category + ": " + ((message == null) ? string.Empty : message));
}

因此,我认为真正的原因是Trace类设计师的决定。

他本可以使Trace.WriteLine(string message)受到保护,以便不打算直接调用它,例如:

protected abstract void WriteLine(string message);

答案 1 :(得分:0)

  1. 如果您不想创建自己的TraceListener,那么从有问题的dll中取消Trace消息的唯一方法是使用{{1}停止所有Trace条消息}。
  2. 请注意,这也会停止您自己的Trace.Listeners.Clear()来电。我之所以提到这一点,是因为我知道一些从未使用Trace的应用程序,并且在一个非常嘈杂的库中不断地写入输出窗口时会受到严重的性能影响。

    1. 我建议创建一个Trace.WriteLine,它使用反射来查找要在调用堆栈中忽略的dll。
    2. 无法覆盖TraceListener,但可以覆盖默认Trace.WriteLine中的某些调用以达到相同的效果。

      使用下面的TraceListener可以帮助您清理Visual Studio中的输出窗口,这样您就可以专注于您感兴趣的事件,而不是受到来自第三方库的消息的轰炸。 / p>

      请参阅以下示例代码:

      TraceListener