要實現獲取代碼所在的位置信息的功能, 類System.Diagnostics.StackFrame是關鍵,源碼如下:
執行結果如下:
C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Program.cs
24
13
ConsoleApplication1.exe
ConsoleApplication1.Program
Void SecondLevel()
分析如下:
構造函數StackFrame(int skipFrames, bool fNeedFileInfo)中,skipFrames為堆棧上幀跳過當前幀的幀數,fNeedFileInfo表示是否想獲取堆棧幀所在文件名、行號、列號(Visual Studio 2010中,定位到構造函數StackFrame(1, true)調用處,按F12,即可看到此信息)。
那麼什麼是堆棧幀?“堆棧幀是在堆棧中為當前正在運行的函數分配的區域(或空間)。傳入的參數、返回地址(當這個函數結束後必須跳轉到該返回地址。譯注:即主調函數的斷點處)以及函數所用的內部存儲單元(即函數存儲在堆棧上的局部變量)都在堆棧幀中。”(http://book.51cto.com/art/200804/70915.htm)舉個例子,A()調用B(),B()調用C(),那麼,B()所處的堆棧幀剛好在C()所處堆棧幀的上一個,也就是說B()相對C()的幀跳數為1,A()的相對C()的幀跳數就為2。
好了,明白了這個,再來看將FirstLevel()中“StackFrame stackFrame = new StackFrame(1, true);”改為“StackFrame stackFrame = new StackFrame(2, true);”後的結果:
C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Program.cs
29
13
ConsoleApplication1.exe
ConsoleApplication1.Program
Void Main(System.String[])