【问题标题】:Methods execution order方法执行顺序
【发布时间】:2013-01-01 03:13:22
【问题描述】:

有很多A、B、C等类。
在每一个中,都有一些方法:

class A {  
   void a1() { ...; }
   void a2() { ...; }
}
class B {  //dll
   void b1() { ...; }
   void b2() { ...; }
}
class C {  //dll
   void c1() { ...; }
   void c2() { ...; }
}

A类是我写的,B类和C类是导入的dll。

对于 A 类,我可以设置断点进行跟踪,但对于 B 类和 C 类,我不能。
我的程序将包含数百个课程,我想按顺序跟踪 每个类中的方法都被调用。
dll中定义了方法,能不能输出这种信息?

例如。 a1 -> b2 -> c1 -> a2

添加:
尤其是当一个 dll 方法调用另一个 dll 方法时。
在这种情况下,包装器将没有什么帮助。
有人吗?

【问题讨论】:

    标签: c# .net visual-studio-2010 debugging dll


    【解决方案1】:

    如果代码在没有源代码或调试符号的 DLL 中提供给您,则您的调试选项相当有限:您无法在没有源代码的情况下设置断点,除非您对反汇编感到满意。

    解决此问题的一种方法是将外部代码包装在您自己的类中,如下所示:

    class CWrap {
        private readonly C wrapped = new C();
        public void c1() {
            log.Info("Entering c1");
            wrapped.c1();
            log.Info("Entering c1");
        }
        public void c2() {
            log.Info("Entering c2");
            wrapped.c2();
            log.Info("Exiting c2");
        }
    }
    

    【讨论】:

    • 这种方法的唯一问题是确保所有原始 C 的方法都被包装的方法替换。当 C 有数千种方法时,它可能是一场噩梦。
    • @Chris 当C 有超过 20 个方法时,我会编写一个简单的基于反射的程序来为我编写包装器:枚举方法,并打印出包装器将它们放入一个文本文件中。根据需要编辑文件,保存为 CS 文件,然后编译。
    • 如果有另一个 dll "D" 调用 "C" 中的方法,那么包装器将无济于事。
    【解决方案2】:
    1. 多线程应用于方法,而不是类。

    2. 一旦你启动线程,顺序是不确定的。 Thread order execution

      var a = new A();  
      var b = new B();  
      var c = new C();
      
      new Thread(a.a1).Start();
      new Thread(b.b1).Start();
      new Thread(c.c1).Start();
      

      a1、b1、c1 没有明确的顺序。

    3. 如果您愿意,可以使用 Tasks 流水线化执行。

      Tasks.StartNew(()=> a.a1()).ContinueWith(_ => b.b1().ContinueWith(_=>c.c1); 
      

      它通过管道执行 a1、b1 和 c1。

      它利用Tasks.ContinueWith

    即使在dll中定义了方法,也能输出这种信息吗?

    是的,如果您指定debug build

    【讨论】:

    • 多线程不是这里的问题。只想吐槽执行顺序。