【问题标题】:.NET Profiler - Getting The Type Of A Function Parameter.NET Profiler - 获取函数参数的类型
【发布时间】:2021-02-26 22:07:53
【问题描述】:

我已经实现了 .Net Profiler 回调,它允许我获取有关 .NET 应用程序中调用的所有函数的数据。函数回调很好用。从回调开始,我调用了

GetModuleMetaData(moduleId, ofRead, IID_IMetaDataImport, (IUnknown**)&metaDataImport);

我随后调用的对象

metaDataImport->EnumParams(&phEnum, (mdMethodDef)metaDataToken, rParams, cMax, &pcTokens);

pcTokens 包含一组参数引用标记。我可以使用这些标记通过以下调用获取参数名称。

metaDataImport->GetParamProps(rParams[i], &(mdMethodDef)metaDataToken, &pulSequence, szName3, cchName3, &pchName3, NULL, NULL, NULL, NULL);

我一直在尝试查找每个参数的类型。我找不到任何可以给我参数类型的文档。 https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/metadata/imetadataimport-interface

有什么想法吗?

【问题讨论】:

    标签: .net clr-profiling-api


    【解决方案1】:

    如果要接收CorElementType的参数, 你可以通过签名解析来做到这一点。每个方法都有所有本地变量和参数类型的签名。 通过GetSigFromTokenGetMethodSpecPropsmethodSpec)即可收到签名。

    之后,您可以解析签名并提取所需的信息。 我建议你阅读ECMA-355I.8.6.1 Signatures,尤其是I.8.6.1.5 Method signatures 段落,以了解签名的格式。

    这是example of type parser in c#c++ parser by David Broman

    【讨论】:

    • 感谢您的回复。知道是否有更简单的方法来获取类型的字符串?基本上在枚举参数时,我只是想快速检查类型是否为字符串。
    • 我很确定没有更简单的方法。不幸的是,.net profiler API 中没有内置的类型解析器。
    • 感谢您的信息!
    • 一旦你能够解析函数的参数类型,你知道如何确定它们的大小吗?我按照您发送的示例进行操作,在该示例中我能够确定函数参数的类型。我有实际参数所在的内存地址,但我不知道如何遍历内存地址并获取每个参数值。 ELEMENT_TYPE_STRING 是 8 个字节吗? ELEMENT_TYPE_PTR 是 4 个字节吗?我如何找出每个参数的大小?再次感谢您提供的任何信息。
    • ELEMENT_TYPE_PTR 是参数的类型,如ELEMENT_TYPE_I4 或ELEMENT_TYPE_STRING,它不是参数的大小。我认为本指南可以帮助您更多地了解签名,它是如何在 blob、内存和压缩整数中表示的,用于从签名中提取的元数据。第 1 部分:codeproject.com/Articles/42649/… 第2 部分:codeproject.com/Articles/42655/…
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多