////////////////////////////////////////////////////////////////////////////////
//Author: stardicky                                                           //
//E-mail: stardicky@hotmail.com                                               //
//QQNumber: 9531511                                                           //
//CompanyName: Ezone International                                            //
//Class: HBS-0308                                                             //
//title: 如何在DotNet中进行栈的跟踪                                   //
////////////////////////////////////////////////////////////////////////////////
using System;
using System.Diagnostics;
namespace StackTraceDemo
{
 /// <summary>
 /// EzoneDemo 的摘要说明。
 /// </summary>
 class EzoneDemo
 {
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main(string[] args)
  {
   
   //获得当前的栈的信息
   EzoneStackTrace.GetCurrentStackInfomation();
   Console.WriteLine("********************************************************************************");
   Console.Write("按任意键继续......");
   Console.Read();
   Function1();
  }
  static void Function1()
  {
   //在方法Function1调用方法Function1_2
   Function1_2();
  }
  static void Function1_2()
  {
   //在方法Function2中获得当前的栈的信息
   EzoneStackTrace.GetCurrentStackInfomation();
   Console.WriteLine("********************************************************************************");
   Console.Write("按任意键继续......");
   Console.Read();
   //在方法Function1_2调用方法Function3
   Function3();
   
  }
  static void Function3()
  {   
   //在方法Function2中获得当前的栈的信息
   EzoneStackTrace.GetCurrentStackInfomation();
   Console.WriteLine("********************************************************************************");
   Console.Write("按任意键继续......");
   Console.Read();
  }
 }
 
 class EzoneStackTrace
 {
  public static void GetCurrentStackInfomation()
  {
   //用构造函数 "1","true" 是因为 "1" 表示屏蔽当前的栈;"true"表示是否生成扩展信息。
   StackTrace MyTrace=new StackTrace(1,true);
   //来制造缩进的效果。
   string Space="";
   for(int i=0;i<MyTrace.FrameCount;i++)
   {
    Console.WriteLine(System.Environment.NewLine);
    Console.WriteLine(Space+"栈名称:"+MyTrace.GetFrame(i).GetMethod());
    Console.WriteLine(Space+"所在行:"+MyTrace.GetFrame(i).GetFileLineNumber());
    //注意这里的列指的是该行的第几个字符,比如说一个制表(tab)字符就算一个字符。
    Console.WriteLine(Space+"所在列:"+MyTrace.GetFrame(i).GetFileColumnNumber());
    Space+="    ";
   }
  }
 }
}
////////////////////////////////////////////////////////////////////////////////
输出结果:
栈名称:Void Main(System.String[])
所在行:20
所在列:4
********************************************************************************
按任意键继续......
栈名称:Void Function1_2()
所在行:40
所在列:4
    栈名称:Void Function1()
    所在行:34
    所在列:3
        栈名称:Void Main(System.String[])
        所在行:28
        所在列:3
********************************************************************************
按任意键继续......
栈名称:Void Function3()
所在行:54
所在列:4
    栈名称:Void Function1_2()
    所在行:47
    所在列:3
        栈名