获取代码所在的位置信息_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 获取代码所在的位置信息

获取代码所在的位置信息

 2014/6/19 23:13:05  .chenjiawei.  程序员俱乐部  我要评论(0)
  • 摘要:要实现获取代码所在的位置信息的功能,类System.Diagnostics.StackFrame是关键,源码如下:1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Text;5usingSystem.Diagnostics;//需要知道源码位置67namespaceConsoleApplication18{9classProgram10{11staticvoidFirstLevel()12
  • 标签:代码

要实现获取代码所在的位置信息的功能, 类System.Diagnostics.StackFrame是关键,源码如下:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Diagnostics; //需要知道源码位置 6   7 namespace ConsoleApplication1 8 { 9     class Program 10     { 11         static void   FirstLevel() 12         { 13               StackFrame   stackFrame = new StackFrame(1, true); 14               Console.WriteLine(stackFrame.GetFileName()); //获取包含所执行代码的文件名。 15               Console.WriteLine(stackFrame.GetFileLineNumber().ToString());   //也就是FirstLevel()被调用地方的行号 16               Console.WriteLine(stackFrame.GetFileColumnNumber().ToString());   //也就是FirstLevel()被调用地方的第一个字母“F”所处的列 17               Console.WriteLine(stackFrame.GetMethod().Module);   //stackFrame.GetMethod()获取在其中执行帧的方法。 18               Console.WriteLine(stackFrame.GetMethod().ReflectedType); 19               Console.WriteLine(stackFrame.GetMethod().ToString()); 20         } 21   22         static void   SecondLevel() 23         { 24               FirstLevel(); 25         } 26   27         static void   Main(string[] args) 28         { 29               SecondLevel(); 30               Console.ReadKey(); 31         } 32     } 33 }

执行结果如下:

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[])

发表评论
用户名: 匿名