Как разрешаются имена TraceSource в программе.NET?

Документация MSDN для класса TraceSource содержит пример того, как файл app.config может перечислять информацию для экземпляров TraceSource:

http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.aspx

Тем не менее, нет никакой информации о том, где хранятся значения TraceSource... где хранятся существующие объекты TraceSource? Когда они (edit: они означают сконфигурированные экземпляры) созданы? Как объект TraceSource знает, как вернуть именованный экземпляр (edit: должен быть настроенный экземпляр) вместо нового экземпляра при создании объекта TraceSource? Могу ли я найти список существующих объектов TraceSource без использования Reflection?

3 ответа

Класс TraceSource хранит закрытый список источников. Но это не доступно никому, кроме самого класса TraceSource.

Раздел файла.config предназначен для настройки прослушивателей для источника трассировки. Поэтому, когда вы создаете TraceSource в своем коде, он использует имя, которое вы передали в конструкторе, и просматривает файл.config, чтобы увидеть, какие слушатели должны быть добавлены или удалены автоматически.

Таким образом, код создает источник, файл.config настраивает его. С другой стороны, файл.config не может создать источник.

Я не уверен, что это ответит на все ваши вопросы - и я боюсь, что я сам недостаточно знаком с классом TraceSource - но, похоже, это была лучшая информационная страница, чем страница MSDN, на которую вы ссылались.

TraceSource

Надеюсь, поможет!

TraceSource объекты хранятся?

В статической коллекции (т.е. по одной копии на домен приложения), но в версии.NET они хранятся со слабыми ссылками, которые могут привести к утечкам памяти, если создается слишком много. Моно версия, если я правильно помню, не имеет этой проблемы.

Для деталей, я рекомендую прочитать источник - источники Mono легче отследить, потому что они официально открыты.

Когда они построены?

Когда приложение, которое пишет трассировку, пишет TraceSource source = new TraceSource();

Как объект TraceSource знает, как вернуть именованный экземпляр вместо нового при создании объекта TraceSource?

Точно сказать не могу.

Могу ли я найти список существующих объектов TraceSource без использования Reflection?

Раньше для этого можно было использовать RedGate Reflector. System.Net и библиотеки WCF используют System.Diagnostics, но немногие используют. В API нет способа просто объединить среду выполнения с текущими источниками трассировки, это было бы неплохо.

Другие вопросы по тегам