2013-01-01 116 views
1

有許多類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。

帶班AI可以把斷點跟蹤,但我不能與B類ANC C.
我的程序將是幾百個類的,我想在什麼順序 方法來跟蹤每個班都被稱爲。
即使有在dll中定義的方法,是否可以輸出這種信息?

Ex。 a1 - > b2 - > c1 - > a2

加:
特別是當一個DLL方法調用另一個DLL方法。
在這種情況下,包裝將沒有多大幫助。
有人嗎?

回答

0
  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.StartNew(()=> a.a1()).ContinueWith(_ => b.b1().ContinueWith(_=>c.c1); 
    

    它管道執行a1,b1和c1。

    它利用Tasks.ContinueWith

是否有可能輸出這樣的信息,甚至有方法DLL中定義?

是的,如果你指定debug build

+0

多線程是不是這裏的問題。只是想吐出執行順序。 – Chris

2

如果代碼涉及到你在沒有源或調試符號的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"); 
    } 
} 
+0

這種方法的唯一問題是確保所有原始C的方法都被包裝的方法替換。當C有數千種方法時,它可能是一場噩夢。 – Chris

+0

@Chris當'C'有20種以上的方法時,我會編寫一個簡單的基於反射的程序來爲我編寫包裝:枚舉這些方法,並將它們的包裝打印到文本文件中。根據需要編輯文件,另存爲CS文件並編譯。 – dasblinkenlight

+0

如果還有另一個「D」調用「C」中的方法,那麼這個包裝就沒什麼幫助。 – Chris