2013-01-01 2 views
1

많은 클래스 A, B, C 등이 있습니다. 가져온 DLL메소드 실행 순서

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

클래스 A 나와 클래스 B 및 C에 의해 코딩된다 : 이들 각각에
는 몇 가지 방법이있다.

와 클래스 AI는 추적 중단 점을 넣을 수 있습니다,하지만 난 클래스 B ANC C.
내 프로그램을 할 수 없습니다 클래스의 수백 될 것입니다 내가 순차적 어떤 순서로 방법으로 추적하려면 각 클래스가 호출됩니다.
dll에 정의 된 메서드가 있어도 이러한 종류의 정보를 출력 할 수 있습니까?

Ex. a1 -> b2 -> c1 -> a2

추가 :
특히 dll 메소드가 다른 dll 메소드를 호출 할 때.
이 경우 래퍼는 거의 도움이되지 않습니다.
누구?

답변

0
  1. Mutltithreading은 클래스가 아닌 메소드에 적용됩니다.

  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에 정의에도 존재 이러한 정보 가능한가 하죠?

코드가없는 소스 또는 디버그 기호 DLL에 당신에게 오는 경우 debug build

+0

멀티 스레드가 여기에 문제가되지 않습니다. 실행 명령을 내뱉기 만하면됩니다. – Chris

2

를 지정하면 예, 디버그 옵션은 다소 제한됩니다 : 당신이하지 않으면 당신은, 아니 소스 중단 점을 설정할 수 없습니다 분해에서 편안 하 게 찾고. 이 문제를 해결하기 위해

한 가지 방법은 다음과 같이 자신의 클래스에 외부 코드를 래핑하는 것입니다 :

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

"C"에서 메서드를 호출하는 다른 dll "D"가있는 경우에는 래퍼가 거의 도움이되지 않습니다. – Chris