Как разрешаются имена 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 объекты хранятся?
В статической коллекции (т.е. по одной копии на домен приложения), но в версии.NET они хранятся со слабыми ссылками, которые могут привести к утечкам памяти, если создается слишком много. Моно версия, если я правильно помню, не имеет этой проблемы.
Для деталей, я рекомендую прочитать источник - источники Mono легче отследить, потому что они официально открыты.
Когда они построены?
Когда приложение, которое пишет трассировку, пишет TraceSource source = new TraceSource();
Как объект TraceSource знает, как вернуть именованный экземпляр вместо нового при создании объекта TraceSource?
Точно сказать не могу.
Могу ли я найти список существующих объектов TraceSource без использования Reflection?
Раньше для этого можно было использовать RedGate Reflector. System.Net и библиотеки WCF используют System.Diagnostics, но немногие используют. В API нет способа просто объединить среду выполнения с текущими источниками трассировки, это было бы неплохо.