Как использовать System.Diagnostics.TraceSource вместо класса System.Diagnostics.Debug?

Я читаю Руководство по разработке .NET Framework - Как to: Используйте TraceSource и фильтры с прослушивателями трассировки и в самом начале есть следующая рекомендация:

Основное отличие версии 2.0 заключается в том, что трассировку можно инициировать через экземпляры TraceSource. TraceSource предназначен работать как расширенная система трассировки и может использоваться вместо статических методов более старых Trace и Отладка классов трассировки. Знакомое Трассировка и Классы отладки все еще существуют, но рекомендуется использовать TraceSource для трассировки.

Я понимаю, как TraceSource используется вместо Trace, но я еще не понял, как он используется для замены Отладка.

Вот цитата из книги C# 5.0 в двух словах: Полная ссылка:

Debug и Trace – это статические классы, предоставляющие базовые возможности ведения журналов и утверждений.
Эти два класса очень аналогичный; главным отличием является их предполагаемое использование.

А теперь более подробное описание разницы:

Все методы класса Debug определяются с помощью [Conditional("DEBUG")].
Все методы класса Trace определяются с помощью [Conditional("TRACE")].

Таким образом, это приводит к устранению Вызовы Debug в сборке Realease:

Это означает, что все обращения к Отладка или Trace удаляются компилятором, если вы не определите символы DEBUG или TRACE.

Как работает TraceSource объяснить эту разницу?


person Egor Okhterov    schedule 10.08.2015    source источник
comment
Не знаю, в чем вопрос, TraceSource не записывает звонки Trace.XXX и Debug.XXX, только звонки TraceSource.XXXX. Ему не нужно учитывать эту разницу, поскольку он все равно не прослушивает эти вызовы... Вы можете посмотреть код TraceSource: referencesource.microsoft.com/#System/compmod/system/, но для записи вызовов все еще необходимо определить TRACE.   -  person Ron Beyer    schedule 10.08.2015
comment
@Ron: Извините, что я недостаточно ясен :) Как бы вы заменили Debug.WriteLine() вызовами TraceSource traceSource;, чтобы они также были удалены из сборки DEBUG?   -  person Egor Okhterov    schedule 10.08.2015
comment
@Ron: я просмотрел исходный код TraceSource.cs и не нашел ни одного метода с пометкой [Conditional(DEBUG)]. Вполне возможно, что я что-то упускаю, не могли бы вы указать мне на этот метод?   -  person Egor Okhterov    schedule 10.08.2015
comment
Они помечены [Conditional("TRACE")], поэтому трассировка будет работать в выпуске, пока определен символ TRACE. Если вы хотите, чтобы они были удалены из отладочной сборки, перейдите в свойства сборки и снимите флажок «Определить константу TRACE» для параметров отладочной сборки. DEBUG не подразумевает TRACE.   -  person Ron Beyer    schedule 10.08.2015
comment
Кстати, TRACE также по умолчанию определено для релизных сборок, и вы меняете его таким же образом. Вы также можете отменить его определение для одного файла кода, включив #undef TRACE в начало файла.   -  person Ron Beyer    schedule 10.08.2015
comment
@Ron: Пожалуйста, простите меня еще раз за мою неясность. Я не хочу удалять методы, помеченные как [Conditional("TRACE")], я хочу, чтобы старые операторы Debug.WriteLine() преобразовывались в traceSource.WriteDebug(), и я хочу, чтобы эти вызовы TraceSource были удалены из сборки DEBUG.   -  person Egor Okhterov    schedule 10.08.2015
comment
Вы хотите сделать это автоматически? Например, вызовы Debug.WriteLine перенаправляются на источник трассировки? Последняя часть проста, просто снимите отметку с определения трассировки в сборке отладки. Но как вы хотите преобразовать старые утверждения? Я могу привести пример того, как это сделать автоматически, если это необходимо...   -  person Ron Beyer    schedule 10.08.2015
comment
вместо этого используйте EventSource: blogs.msdn.com/b/vancem/archive/2012/07/09/   -  person magicandre1981    schedule 11.08.2015
comment
@magicandre1981: Почему?   -  person Egor Okhterov    schedule 11.08.2015
comment
вы можете сопоставить свои события с системными событиями (процессор, диск, сетевые вызовы), чтобы увидеть, как ваш код влияет на систему.   -  person magicandre1981    schedule 11.08.2015
comment
@magicandre1981: вау, это слишком мощно для моего приложения :)   -  person Egor Okhterov    schedule 11.08.2015


Ответы (1)


Лучшее решение, которое я придумал, — это написание методов расширения. Если есть что-то лучше, я отмечу ваш ответ как принятый :).

public static class TraceSourceExtentions
{
    [Conditional("DEBUG")]
    public static void TraceDebug(this TraceSource traceSource, string message)
    {
        traceSource.TraceEvent(
            eventType: TraceEventType.Verbose,
            id: 0,
            format: message);
    }

    [Conditional("DEBUG")]
    public static void TraceDebug(this TraceSource traceSource, string format, params object[] args)
    {
        traceSource.TraceEvent(
            eventType: TraceEventType.Verbose,
            id: 0,
            format: format,
            args: args);
    }
}

Это решение меня не устраивает, потому что, если есть несколько сборок, которым нужны отладочные трассировки, мы обречены рассматривать либо дублирование кода в этих сборках, либо создание внешней избыточной зависимости (еще одна сборка, которая будет содержать этот класс).

person Egor Okhterov    schedule 10.08.2015