2016-07-26 12 views
1

MDBG 샘플을보고 관리되는 디버거를 구현하려고합니다.IMetaDataImport EnumMethods를 사용하여 기본 클래스 계층 구조 메서드 가져 오기

MDBG는 주어진 범위 내에서 함수 이름을 확인할 수 있지만 기본 클래스는 고려하지 않습니다.

MDBG 이러는된다

/// <summary> 
    /// Resolves a Function from a Module, Class Name, and Function Name. 
    /// </summary> 
    /// <param name="mdbgModule">The Module that has the Function.</param> 
    /// <param name="className">The name of the Class that has the Function.</param> 
    /// <param name="functionName">The name of the Function.</param> 
    /// <returns>The MDbgFunction that matches the given parameters.</returns> 
    public MDbgFunction ResolveFunctionName(MDbgModule mdbgModule, string className, string functionName) { 
     ... 
     foreach (MethodInfo mi in t.GetMethods()) { 
      if (mi.Name.Equals(functionName)) { 
       func = mdbgModule.GetFunction((mi as MetadataMethodInfo).MetadataToken); 
       break; 
      } 
     } 
     return func; 
    } 

Type.GetMethods()를 재정의하고 이러한 구현을 갖고 있지만, IMetaDataImport.EnumMethods 사용 :

m_importer.EnumMethods()가 MethodDef 토큰을 열거
 public override MethodInfo[] GetMethods(BindingFlags bindingAttr) { 
     ArrayList al = new ArrayList(); 
     IntPtr hEnum = new IntPtr(); 

     int methodToken; 
     try { 
      while (true) { 
       int size; 
       m_importer.EnumMethods(ref hEnum, (int) m_typeToken, out methodToken, 1, out size); 
       if (size == 0) { 
        break; 
       } 
       al.Add(new MetadataMethodInfo(m_importer, methodToken)); 
      } 
     } 
     finally { 
      m_importer.CloseEnum(hEnum); 
     } 
     return (MethodInfo[]) al.ToArray(typeof (MethodInfo)); 
    } 

문제가 있음을 지정된 유형의 메소드를 나타내는데 클래스 계층의 모든 메소드에 관심이 있습니다.

클래스 계층 구조에 정의 된 모든 메소드를 얻으려면 어떻게해야합니까? (분명히 반성과 같은 일반적인 방법은 다른 프로세스에서 정의 된 유형을 분석하므로 사용할 수 없습니다.)

interop 및 deep CLR/CIL 구조에 대한 제한된 지식으로 인해 여기에 올바른 방법을 찾는 데 장애가 발생합니다.

모든 조언/제안을 환영합니다!

감사합니다,

답변

2

GetTypeProps가 ptkExtends의 기본 유형의 메타 데이터 토큰을 반환합니다, 당신은 당신이가는 각에서 방법을 상속 트리를 걸어 수집하는 것을 사용할 수 있습니다.

그러나 메타 데이터 토큰이 TypeDef가 아닐 수 있습니다. TypeRef (형식을 확인해야 함) 또는 TypeSpec (형식 서명을 구문 분석하고 적절한 TypeDef/TypeRef를 추출해야 함)이 될 수 있습니다.

+0

감사합니다. 이제는 내가해야 할 일을 조금 더 잘 이해하지만 아직 완전히 명확하지는 않습니다. GetTypeRefProps/GetTypeDefProps 메서드를 사용하여 MDBG에서 TypeRef 및 TypeDef를 처리하는 방법을 볼 수 있습니다. 하지만 TypeSpec 서명을 어떻게 파싱해야합니까? – 3615

+0

서명 blob을 얻으려면 [GetTypeSpecFromToken] (https://msdn.microsoft.com/en-us/library/windows/desktop/hh870637(v=vs.85) .aspx)을 사용하십시오. 서명 형식은 [ECMA-335] (http://www.ecma-international.org/publications/standards/Ecma-335.htm) 파티션 II 섹션 23.2.14에 정의되어 있습니다. –

+0

다시 한번 감사드립니다! 나는 그것을 시험해 볼 시간이 필요하다. 그런 다음 몇 가지 결과로 돌아갈 것이다. – 3615