0

我有一个应用程序,我在其中使用 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

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

4

1 回答 1

0

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

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

于 2014-12-29T13:13:43.313 回答