我正在尝试使用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
);
}
答案 0 :(得分:1)
GetFieldProps
仅提供静态信息,因此pValue
&amp; pcchValue
可能仅与表示常量的字段相关。
要从实例获取实际值,我相信您需要使用COR_FIELD_OFFSET.ulOffset
返回的GetClassLayout
来获取相对于ObjectID的内存位置(ObjectID是指向实际实例的指针)并且您可以通过解析GetFieldProps
存储在ppvSigBlob
和pcbSigBlob
中的签名来获得所需的大小/解释(其格式在ECMA-335 Partition II Section 23.2.4中定义)
GetClassLayout
查找其组件字段的位置。GetStringLayout
和GetArrayObjectInfo
进一步细分字符串和数组。