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
    进一步细分字符串和数组

GetFieldProps仅提供静态信息,因此
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
    );
}