使用IMetaDataImport EnumMethods获取基类层次结构方法

时间:2016-07-26 09:53:10

标签: c# interop cil mdbg imetadataimport

我正在尝试实现管理调试器,查看MDBG示例。

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:

     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));
    }

问题是m_importer.EnumMethods()枚举表示指定类型方法的MethodDef标记,但我对类层次结构中的所有方法感兴趣。

如何获得类层次结构中定义的所有方法? (显然,不能使用像反射这样的常用方法,因为我分析了在其他过程中定义的类型)

我对互操作和深层CLR / CIL结构的了解有限,为找到正确的方法找到了障碍。

欢迎任何建议/建议!

此致

1 个答案:

答案 0 :(得分:2)

GetTypeProps将在ptkExtends中返回基类型的元数据标记,您可以使用它来遍历继承树并从中逐步收集方法。

但请注意,元数据标记可能不是TypeDef。它可能是TypeRef(要求您解析类型)或TypeSpec(要求您解析类型签名并提取适当的TypeDef / TypeRef)。