2014-12-29 28 views
0

我有一個應用程序,我使用TraceListener在應用程序執行時收集數據/調試信息。同時有多個監聽器,其中一個會將跟蹤信息寫入磁盤文件,另一個可能會以字符串形式收集(短時間執行),然後它會顯示給用戶或可能保存到另一個文件中每個需求。跨域跟蹤偵聽器VB.NET

一切順利,除非我們另有其他決定。

我們有很多在運行時加載並執行的插件。然而,問題在於它很難替換插件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),以及一種方式? 任何想法將不勝感激 謝謝

回答

0

應用程序加載時讀配置。因此,對於未按照常規方式加載程序集的插件來說,看起來似乎沒有讀取配置。您可以在代碼中配置跟蹤偵聽器,雖然它顯然不夠靈活。

要在源代碼中配置跟蹤偵聽器,請將偵聽器添加到TraceSource的偵聽器集合中。確保在跟蹤監聽器的生命中發生過一次,否則您將獲得重複的監聽器。

+0

我忘了提及我已經這樣做了。安裝/開始從代碼本身收聽,而不是從配置。因此,在代碼中,我將它安裝爲像StringTraceListener.AddTraceListener(「ListenerID」),並且配置文件中沒有任何內容,但是,無論您是使用代碼啓動的跟蹤偵聽器還是配置文件,都不會發送跟蹤來自新的應用程序域 –

+0

看起來像當您訪問靜態變量(通過跟蹤偵聽器,所有跟蹤偵聽器保存在一個靜態集合中,每個域中有一個),您要麼獲取副本,要麼獲取其他應用程序域參考到全局跟蹤偵聽器集合,參考http://stackoverflow.com/questions/9806372/static-variable-instances-and-appdomains-what-is-happening – MatthewMartin