2013-01-16 57 views
0

我在寫一個類,它必須作爲dll文件添加到任何.NET項目中。 我被困在點,我需要使事件System.Diagnostics.StackTrace「last_method_name_changed」。StackTrace ByRef VB.NET中的另一個類

所以我需要找到一種方法來檢測StackTrace中的變化,或創建線程進入或退出方法時引發的事件。喜歡的東西:

Public Class DllClass 
    Public Shared CallerTrace as StackTrace = Nothing 
    Public Shared New(ByRef NewTrace as StackTrace) 'This is called from form. 
     '''I know this will make a copy, but I have failed to find a solution. 
     CallerTrace = NewTrace 
    End Sub 
    Public Shared Sub StackTrace_Changed() Handles CallerTrace.Changed 
     MsgBox(CallerTrace.GetFrame(0).GetMethod.Name) 
    End Sub 
End Class 

從主窗體這應該是隻有一次叫:

Dim DllCls as New DllClass(New Diagnostics.StackTrace) 

我會在製作「參考鏈接」或指針堆棧跟蹤和事件,將感謝任何幫助在CallerTrace.GetFrame(0).GetMethod.Name更改時引發。

回答

1

沒有複製作爲StackTrace是引用類型(分配給引用不復制基礎對象)。參數聲明中的ByRef是無關和冗餘的。

另一方面,您沒有聲明CallerTraceWithEvents,因此您實際上不會聽到由它引發的任何事件。這不會起作用,因爲System.Diagnostics.StackTrace沒有聲明可以收聽的公共事件。攔截方法調用的方法從根本上不起作用。

要以您設想的方式攔截方法調用,您需要進一步鑽取方法。幸運的是,有些庫已經允許,如AOP library PostSharp

+0

謝謝您的重播! – user1983608

+0

我明白你的觀點,但我還有一個問題。例如,如果我創建後臺線程,並將無限循環檢查StackTrace的更改。我如何獲得當前主線程中使用的方法? – user1983608

+0

我不知道你是否可以獲得單獨線程的堆棧跟蹤。實際上,Stack Overflow的其他答案表明[這是不可能的](http://stackoverflow.com/a/5307360/1968)。 –

相關問題