2016-08-08 4 views
3

MDBG 샘플을 사용하여 관리되는 .NET 디버거를 만들고 있습니다.다형성 클래스의 Func-eval

MDBG 샘플은 내부 클래스 계층 구조를 검색하지 않고 지정된 인스턴스의 최상위 클래스에서만 작동합니다. 나는 계층 구조를 거쳐 가능한 모든 방법을 얻을 수있었습니다. 그러나 문제는 경우에 발생합니다 내가 대신 기본 클래스의 클래스를 얻을 ICorDebugValue으로 쿼리가 ICorDebugValue2의 위해 :: GetExactType castedToBase를 받고있을 때

public abstract class Base{ 
     public Base() {SomeProp = "Base"} 
     public string SomeProp {get;set;} 
    } 

    public class A : Base{ 
     public Base() {SomeProp = "A"} 
     public new string SomeProp {get;set;} 
    } 

    public static void Main(){ 
     var a = new A(); 
     var castedToBase = (Base)a; 
     //castedToBase.SomeProp -- expect result to be "Base" when debugging 
    } 

문제입니다. 그 시점에서 나는 어떤 메소드 get_SomeProp을 호출 할지를 더 이상 구별 할 수 없다. ICorDebugValue2 :: GetExactType을 고려하여 캐스트를 수행하고 항상 기본 유형을 반환하지 않을 것으로 예상됩니다.

어떤 메소드를 호출해야하는지 어떻게 이해할 수 있습니까?

내가 지금하고있는 코드 중 일부는 다음과 같습니다. mdbgValue은 castedToBase 개체를 나타냅니다. szTypedef는이 감지 된 경우에만 방법은 객체의 유형을 변경하지 않는 기본 클래스의에 객체를 캐스팅 "A"대신 예상 "자료"

IMetadataImport importer; 
    var classToken = mdbgValue.CorValue.ExactType.Class.Token; 

    int size; 
    int ptkExtends; 
    TypeAttributes pdwTypeDefFlags; 
    importer.GetTypeDefProps(classToken, 
     null, 
     0, 
     out size, 
     out pdwTypeDefFlags, 
     out ptkExtends 
     ); 
    StringBuilder szTypedef = new StringBuilder(size); 
    importer.GetTypeDefProps(classToken, 
     szTypedef, 
     szTypedef.Capacity, 
     out size, 
     out pdwTypeDefFlags, 
     out ptkExtends 
     ); 
+1

개체를 기본 클래스에 캐스팅해도 개체가 변경되지 않고 인식 방법 만 변경됩니다. "인식 된"형식을 값과 함께 전달해야하며 올바른 형식을 찾는 목적으로 실제 형식 대신 해당 형식을 사용해야한다고 제안합니다. –

+0

@BrianReichle 제안 해 주셔서 감사합니다. 하지만 "인식 된"유형이 없으므로 디버거가 객체에 대해 수행 된 캐스트를 알아야합니다. – 3615

+0

아마도 '정적으로 결정된 유형'은 '인식 된'유형보다 더 나은 이름입니다. 값 (필드 유형, 매개 변수 유형, 메소드/특성 리턴 유형 등)이있는 곳이라면 어디에서나 가져올 수 있습니다. –

답변

3

를 반환합니다. "인식 된"형식을 값과 함께 전달해야하며 올바른 형식을 찾는 목적으로 실제 형식 대신 해당 형식을 사용해야한다고 제안합니다.

"인식 된"유형은 값을 얻은 위치를 기반으로 정적으로 결정된 유형입니다.

  • ICorDebugILFrame::GetArgument()을 사용하여 매개 변수의 값을 얻은 경우 메서드 서명에서 해당하는 인수 형식을 추출하십시오.
    • 첫 번째 인수와 메서드 서명에 HasThis 플래그가 있지만 ExplicitThis 플래그가없는 경우 대신 값에서 형식을 가져옵니다.
  • 그런 방법 주민 서명의 유형 추출 ICorDebugILFrame::GetLocalVariable() 사용 (서명 방법 헤더로부터 추출 될 필요가 열차의 메타 데이터 토큰.)
  • 는 가지고있는 경우 지역의 값을 가지고 있으면 값을 ICorDebugEval (예 : 속성 가져 오기 도구)로 실행하면 호출 한 메서드의 반환 형식 (메서드 서명에서도 추출한 값)을 사용해야합니다.
  • 필드에서 값을 얻은 경우 필드 서명의 형태
  • 값을 전송하면 캐스팅 할 모든 유형을 사용하십시오.
+0

Brian! 당신의 대답은이 의심의 바다에서 익사하지 못하게합니다. 나는 이제 당신의 요점을 알기 시작하고 있다고 생각하지만, 이것을 시험해보고 내가 어디에서 얻을 수 있는지 볼 시간이 필요합니다. 개념적 차원에서 불분명 한 유일한 사실은 캐스트에 관한 마지막 단락입니다. 이 경우에는 구문 분석 할 서명/필드 서명이 없으므로 어디에서 유형을 가져 오겠습니까? – 3615

+0

디버거에서 표현식을 평가할 때 어떤 시점에서 캐스팅을 지원해야한다는 가정하에 방금 던졌습니다. 예. '((A) castedToBase) .SomeProp' ... 아마도 아직 그것에 대해 걱정하기에는 시기상조입니다 :) –

+0

예, 맞습니다. 내가 언급 한 것처럼 표현을 입력 할 때 defenetely premature about think! 내가 생각한 것은 디버거 표현식이 아닌 코드에 캐스트 된 것입니다. 그것은 질문의 예와 같습니다 :'var castedToBase = (Base) a;'그리고 나서'castedToBase.SomeProp'을 수행하는 디버거에서 속성을 평가하기를 원합니다. 현재 저는 필드와 속성에 대한 평가에 전념하고 있습니다. – 3615