c++ - 使用 GetFieldProps 获取类的属性值

标签 c++ .net clr coreclr imetadataimport

我正在尝试使用 GetFieldProps 获取类中字段的值

最初我使用 GetClassLayout 获取 FieldDef token 数组,然后使用 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
    );
}

最佳答案

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

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

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

关于c++ - 使用 GetFieldProps 获取类的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48743210/

相关文章:

c++ - 跨脚本文件共享 lua 全局变量?

跨 IPC 的 C# 事件

.net - 如何获取远程网络共享的磁盘使用统计信息?

.net - asp.net net.mail - 在 Debug模式下将所有电子邮件路由到不同的电子邮件地址

c# - 将 .NET 应用程序转换为 x86 native 代码

iis - 在 ASP.Net Core 中设置(或不设置).NET CLR 版本有什么影响?

c++ - 带有 stringstreams 的 strdup 导致 valgrind 错误

c++ - 为 TBB 注册环境变量

c# - 作为静态或非静态类的存储库?

c++ - 使用 LUAPlus 将 Lua 表函数绑定(bind)到 C++ 变量