使用 GetFieldProps 获取 class 的 属性 值

Obtaining property values of a class using GetFieldProps

我正在尝试使用 GetFieldProps

获取 class 中字段的值

最初我使用 GetClassLayout 获取 FieldDef 标记数组,然后使用 GetFieldProps.

枚举它们

每个 GetFieldProps 调用 returns S_OK 的结果 填充 szField 中的字段名称。

我在 ExceptionThrown 回调中调用尝试这个,当尝试这个异常时,它 returns _className_message 等的字段名称,但 ppValue 始终为空,pcchValue.

也是如此

如何获取 class 中字段的值?

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

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

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

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

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