我有一個應用程序,我使用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),以及一種方式? 任何想法將不勝感激 謝謝
我忘了提及我已經這樣做了。安裝/開始從代碼本身收聽,而不是從配置。因此,在代碼中,我將它安裝爲像StringTraceListener.AddTraceListener(「ListenerID」),並且配置文件中沒有任何內容,但是,無論您是使用代碼啓動的跟蹤偵聽器還是配置文件,都不會發送跟蹤來自新的應用程序域 –
看起來像當您訪問靜態變量(通過跟蹤偵聽器,所有跟蹤偵聽器保存在一個靜態集合中,每個域中有一個),您要麼獲取副本,要麼獲取其他應用程序域參考到全局跟蹤偵聽器集合,參考http://stackoverflow.com/questions/9806372/static-variable-instances-and-appdomains-what-is-happening – MatthewMartin