使用 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
仅提供静态信息,因此 pValue
和 pcchValue
可能仅与表示常量的字段相关。
要从实例中获取实际值,我相信您需要使用 GetClassLayout
返回的 COR_FIELD_OFFSET.ulOffset
来获取相对于 ObjectID 的内存位置(ObjectID 是指向实际值的指针实例),你可以通过解析 GetFieldProps
存储在 ppvSigBlob
和 pcbSigBlob
中的签名来获得所需的 size/interpretation (其格式在 ECMA-335 Partition II Section 中定义) 23.2.4).
- 如果类型是原始值类型,那么大小和解释应该是不言自明的(例如,Int32 将是一个 4 字节整数)。
- 如果类型是引用类型,则它将是包含 ObjectID 的原生 int 大小的字段。
- 如果类型是枚举,那么它将具有其基础类型的大小(ECMA-335 分区 II 第 14.3 节)。
- 如果类型是非基本类型,那么您可以使用
GetClassLayout
来查找其组件字段的位置。
- 您可以使用
GetStringLayout
和 GetArrayObjectInfo
来进一步分解字符串和数组。
我正在尝试使用 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
仅提供静态信息,因此 pValue
和 pcchValue
可能仅与表示常量的字段相关。
要从实例中获取实际值,我相信您需要使用 GetClassLayout
返回的 COR_FIELD_OFFSET.ulOffset
来获取相对于 ObjectID 的内存位置(ObjectID 是指向实际值的指针实例),你可以通过解析 GetFieldProps
存储在 ppvSigBlob
和 pcbSigBlob
中的签名来获得所需的 size/interpretation (其格式在 ECMA-335 Partition II Section 中定义) 23.2.4).
- 如果类型是原始值类型,那么大小和解释应该是不言自明的(例如,Int32 将是一个 4 字节整数)。
- 如果类型是引用类型,则它将是包含 ObjectID 的原生 int 大小的字段。
- 如果类型是枚举,那么它将具有其基础类型的大小(ECMA-335 分区 II 第 14.3 节)。
- 如果类型是非基本类型,那么您可以使用
GetClassLayout
来查找其组件字段的位置。 - 您可以使用
GetStringLayout
和GetArrayObjectInfo
来进一步分解字符串和数组。