Прослушиватели междоменной трассировки VB.NET

У меня есть приложение, в котором я использую TraceListener для сбора данных/информации об отладке во время выполнения приложения. Существует более одного прослушивателя одновременно, один из них будет записывать информацию трассировки в файл на диске, другой может собирать в строку (на короткий период выполнения), а затем она будет отображаться пользователю или может быть сохранена в другой файл как по потребностям.

Все прошло хорошо, если только мы не решили что-то еще.

У нас было много плагинов, которые загружались во время выполнения и выполнялись. Однако проблема заключалась в том, что было сложно заменить подключаемую DLL, поскольку она использовалась приложением, поэтому нам пришлось остановить и заменить DLL, а затем запустить ее снова. Мы решили использовать appDomain для загрузки плагина, чтобы мы могли легко заменить DLL без перезапуска приложений. Это тоже прошло хорошо, но возникла одна серьезная проблема: прослушиватели трассировки были слепы. Поскольку плагины загружаются в другой домен приложения, поэтому трассировки никогда не достигали родительского домена приложения, который его прослушивал (трассировки, сделанные плагином, который загружается в новый домен приложения).

Наш прослушиватель трассировки выглядит так.

Public Class StringTraceListener
    Inherits TextWriterTraceListener

    Dim sw As System.Text.StringBuilder = Nothing
    Public Overrides Sub WriteLine(ByVal message As String)
        Try
            MyBase.WriteLine(message)
            sw.AppendLine(Now.ToString & " : " & message)

        Catch ex As Exception
            'Do not write anything here... or it might go into recursive loop
        End Try

    End Sub

Интересно, есть ли способ, которым нам не нужно вносить много изменений, а прослушиватель трассировки может также получать трассировки от плагинов (дочерний домен приложения)? Любая идея будет оценена Спасибо


person Sameers Javed    schedule 29.12.2014    source источник


Ответы (1)


Конфиг считывается при загрузке приложения. Таким образом, для подключаемого модуля, в котором сборка не загружается обычным образом, вполне вероятно, что конфигурация не читается. Вы можете настроить прослушиватели трассировки в коде, хотя это, очевидно, менее гибко.

Чтобы настроить прослушиватель трассировки в исходном коде, добавьте прослушиватель в коллекцию Listener TraceSource. Убедитесь, что это происходит один раз в течение жизни этого прослушивателя трассировки, иначе вы получите дубликаты прослушивателей.

person MatthewMartin    schedule 29.12.2014
comment
Забыл упомянуть, что я уже так делаю. Установка/начало прослушивания из самого кода, а не из конфига. Итак, в коде я устанавливаю его как StringTraceListener.AddTraceListener(ListenerID), и в файле конфигурации ничего нет. Но дело в том, что независимо от того, используете ли вы прослушиватели трассировки, инициированные кодом, или из файла конфигурации, трассировки не отправляются обратно из нового домена приложения. - person Sameers Javed; 30.12.2014
comment
Похоже, что когда вы обращаетесь к статической переменной (через прослушиватель трассировки, все прослушиватели трассировки хранятся в статической коллекции, по 1 на домен), вы либо получаете копию, либо получаете ссылку других доменов приложений на глобальную коллекцию прослушивателей трассировки, исх. stackoverflow.com/ вопросы/9806372/ - person MatthewMartin; 30.12.2014