有什么办法可以追踪一个类,是何时实例化的呢?
从网上下了个源码,是一个酒店管理系统,
里面有一个数据库类。
但是我发现启动登录窗体后,这个数据库类就已经构造了。
因为我在类的构造函数中加了一个 messagebox.show,所以一启动登录窗体,这个类就实例化。但是我在这个窗体中找了半天,也没有找到是哪行代码实例化了这个类。我如何可以跟踪到呢?

解决方案 »

  1.   


    构造函数中加了断点,到了断点后,看call stack就知道在哪里调用的了。
      

  2.   


      /// <summary>
      /// 基础类库中用以检查调用者的辅助类
      /// </summary>
      /// <res>
      /// 内部类
      /// </res>
      class stackTraceWalker
      {
        /// <summary>
        /// 检查调用堆栈, 验证, 引发异常或者无操作
        /// </summary>
        /// <returns></returns>
        /// <res>
        /// 对于 ??? login, 可以检查是否包含客户端主程序集
        /// 验证 public key token, 以及 type, method name
        /// </res>
        public static string assertCaller(ICallerContext ctx)
        {
          StackTrace st = new StackTrace();
          StringBuilder sb = new StringBuilder();
          sb.AppendLine("frame count: " + st.FrameCount);
          StackFrame[] frames = st.GetFrames();
          MethodBase mb = null;
          string publicKeyToken = null;
          AssemblyName an = null;
          foreach (StackFrame frame in frames) {
            mb = frame.GetMethod();
            publicKeyToken = mb.Module.Assembly.FullName.Substring(mb.Module.Assembly.FullName.LastIndexOf("PublicKeyToken") + 15);
            sb.AppendLine(publicKeyToken);
          }
          return sb.ToString();
        }
      }  public class eca
      {
        public eca()
        {
          stackTraceWalker.assertCaller(null);
        }    /// <summary>
        /// login
        /// </summary>
        public virtual void login()
        {
          stackTraceWalker.assertCaller(null);
        }
      }
      

  3.   

    运行时使用 call stack 对效率的损害实在是很大