C++ 使用GetFieldProps获取类的属性值
我试图使用 最初我使用C++ 使用GetFieldProps获取类的属性值,c++,.net,clr,coreclr,imetadataimport,C++,.net,Clr,Coreclr,Imetadataimport,我试图使用 最初我使用GetClassLayout获取一个FieldDef令牌数组,然后使用GetFieldProps枚举它们 每个GetFieldProps调用的结果返回S_OK,并填充szField中的字段名称 我在一个异常thrown回调中调用trying this,当我为异常调用trying this时,它返回\u className,\u message等字段名,但是ppValue总是空的,就像pcchValue一样 如何获取类中字段的值 这是我当前方法的一个示例(删除声明等): CO
GetClassLayout
获取一个FieldDef令牌数组,然后使用GetFieldProps
枚举它们
每个GetFieldProps
调用的结果返回S_OK
,并填充szField
中的字段名称
我在一个异常thrown
回调中调用trying this,当我为异常调用trying this时,它返回\u className
,\u message
等字段名,但是ppValue
总是空的,就像pcchValue
一样
如何获取类中字段的值
这是我当前方法的一个示例(删除声明等):
COR_FIELD_OFFSET*fieldTokensandOffset=新的COR_FIELD_OFFSET[fieldArraySize];
m_info->GetClassLayout(
classId,
字段标记和偏移,
现场布置,
&a,,
&b) );
对于(int i=0;iGetFieldProps(
摆脱
&mb,
字段名,
100,,
&pchField,
&pdwAttr,
&ppvSigBlob,
&pcbSigBlob,
&pdwCPlusTypeFlag,
&pValue,
&PCCH值
);
}
GetFieldProps
仅提供静态信息,因此pValue
和pcchValue
可能仅与表示常量的字段相关
要从实例获取实际值,我相信您需要使用GetClassLayout
返回的COR\u FIELD\u OFFSET.ulOffset
来获取相对于ObjectID的内存位置(ObjectID是指向实际实例的指针)您可以通过解析GetFieldProps
存储在ppvSigBlob
和pcbSigBlob
中的签名来获得所需的大小/解释(其格式在ECMA-335 Partition II第23.2.4节中定义)
- 如果类型是基元值类型,那么大小和解释应该是不言而喻的(例如,Int32将是一个4字节的整数)
- 如果类型是引用类型,那么它将是一个包含ObjectID的本机int大小的字段
- 如果该类型是一个枚举,那么它将具有其基础类型的大小(ECMA-335 Partition II第14.3节)
- 如果该类型是非基本类型,则可以使用
查找其组件字段的位置GetClassLayout
- 您可以分别使用
和GetStringLayout
进一步细分字符串和数组GetArrayObjectInfo
pValue
和pcchValue
可能仅与表示常量的字段相关。要从实例获取实际值,我相信您需要使用GetClassLayout返回的相对于ObjectID的COR\u FIELD\u OFFSET.ulOffset
(ObjectID是指向实际实例的指针)。@BrianReichle谢谢。你知道有没有关于如何做到这一点的文档,或者你有一些建议吗?有很多关于单个方法的文档,比如GetClassLayout
,但是我找不到太多关于将它们连接在一起的文档。例如,即使我知道字段值相对于classId的位置,当我不知道它的大小等时,我如何读取它的值。?
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
);
}