跨域跟踪侦听器VB.NET

时间:2014-12-29 11:29:04

标签: cross-domain appdomain tracelistener

我有一个应用程序,我在应用程序执行时使用TraceListener来收集数据/调试信息。同时有多个侦听器,其中一个将跟踪信息写入磁盘文件,其他可能会收集字符串(短时间执行)然后它将显示给用户或可能保存到另一个文件中根据需要。

一切顺利,除非我们决定其他事情。

我们有很多在运行时加载并执行的插件。然而,问题是它很难替换插件DLL,因为它被应用程序使用,所以我们必须停止并替换DLL然后再次启动它。我们决定使用appDomain加载插件,以便我们可以轻松替换DLL而无需重新启动应用程序。 这也很顺利,但是出现了一个主要问题。跟踪池是盲目的。由于插件被加载到不同的应用程序域中,因此跟踪从未到达正在监听它的父应用程序域(插件创建的跟踪,它被加载到新的appdomain中)。

我们的跟踪侦听器如下所示。

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

我想知道,如果有一种方法我们不需要进行太多更改,并且跟踪侦听器也可能从插件(子appDomain)接收跟踪? 任何想法将不胜感激 感谢

1 个答案:

答案 0 :(得分:0)

加载应用程序时读入配置。因此,对于没有以通常方式加载程序集的插件,可能没有读取配置。您可以在代码中配置跟踪侦听器,尽管它显然不太灵活。

要在源代码中配置跟踪侦听器,请向TraceSource的Listener集合添加侦听器。确保在跟踪侦听器的生命周期中发生一次,否则您将获得重复的侦听器。