使用GetFieldProps获取类的属性值

时间:2018-02-12 09:33:56

标签: c++ .net clr coreclr imetadataimport

我正在尝试使用GetFieldProps

获取班级中字段的值

最初我使用GetClassLayout获取FieldDef标记数组,然后使用GetFieldProps枚举它们。

每个GetFieldProps调用的结果都会返回S_OK填充szField中字段的名称。

我正在调用ExceptionThrown回调中尝试此操作,当尝试此异常时,它会返回_className_message等字段名称,但ppValue永远是空的,pcchValue也一样。

如何获取课程中字段的值?

这是我当前方法的一个示例(删除了声明等):

COR_FIELD_OFFSET* fieldTokensAndOffsets = new COR_FIELD_OFFSET[fieldArraySize];
m_info->GetClassLayout(
    classId,
    fieldTokensAndOffsets,
    fieldArraySize,
    &a,  
    &b);


for (int i = 0; i < fieldArraySize - 1; i++) {

    auto rid = fieldTokensAndOffsets[i].ridOfField;

    MetaDataImport->GetFieldProps(
        rid,
        &mb,
        fieldName,
        100,,
        &pchField,
        &pdwAttr,
        &ppvSigBlob,
        &pcbSigBlob,
        &pdwCPlusTypeFlag,
        &pValue,
        &pcchValue
    );
}

1 个答案:

答案 0 :(得分:1)

GetFieldProps仅提供静态信息,因此pValue&amp; pcchValue可能仅与表示常量的字段相关。

要从实例获取实际值,我相信您需要使用COR_FIELD_OFFSET.ulOffset返回的GetClassLayout来获取相对于ObjectID的内存位置(ObjectID是指向实际实例的指针)并且您可以通过解析GetFieldProps存储在ppvSigBlobpcbSigBlob中的签名来获得所需的大小/解释(其格式在ECMA-335 Partition II Section 23.2.4中定义)

  • 如果类型是原始值类型,那么大小和解释应该是不言而喻的(例如,Int32将是一个4字节整数)。
  • 如果类型是引用类型,那么它将是包含ObjectID的本机int大小的字段。
  • 如果类型是枚举,则它将具有其基础类型的大小(ECMA-335 Partition II Section 14.3)。
  • 如果类型是非基本类型,则可以使用GetClassLayout查找其组件字段的位置。
  • 您可以尊重地使用GetStringLayoutGetArrayObjectInfo进一步细分字符串和数组。