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 と C ではできません。
私のプログラムは何百ものクラスになる予定であり、各クラスのメソッドがどの順序で呼び出されるかを追跡したいと考えています。
dllにメソッドが定義されていても、このような情報を出力することはできますか?

元。a1 -> b2 -> c1 -> a2

追加:
特に dll メソッドが別の dll メソッドを呼び出す場合。
この場合、ラッパーはほとんど役に立ちません。
誰?

4

2 に答える 2

2

コードがソースまたはデバッグ シンボルのない DLL で表示される場合、デバッグ オプションはかなり制限されます。逆アセンブルに慣れていない限り、ソースなしでブレークポイントを設定することはできません。

この問題に対処する 1 つの方法は、次のように、独自のクラスで外部コードをラップすることです。

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");
    }
}
于 2013-01-01T03:18:26.780 に答える
0
  1. マルチスレッドは、クラスではなくメソッドに適用されます。

  2. スレッドを開始すると、順序は不定になります。スレッド順実行

    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を指定した場合

于 2013-01-01T03:16:37.650 に答える