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 구조에 대한 제한된 지식으로 인해 여기에 올바른 방법을 찾는 데 장애가 발생합니다.
모든 조언/제안을 환영합니다!
감사합니다,
감사합니다. 이제는 내가해야 할 일을 조금 더 잘 이해하지만 아직 완전히 명확하지는 않습니다. GetTypeRefProps/GetTypeDefProps 메서드를 사용하여 MDBG에서 TypeRef 및 TypeDef를 처리하는 방법을 볼 수 있습니다. 하지만 TypeSpec 서명을 어떻게 파싱해야합니까? – 3615
서명 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에 정의되어 있습니다. –
다시 한번 감사드립니다! 나는 그것을 시험해 볼 시간이 필요하다. 그런 다음 몇 가지 결과로 돌아갈 것이다. – 3615