首页 > 解决方案 > 用于对象表示和托管/非托管交互的结构/类元数据

问题描述

我知道有很多类似的问题,但我想了解从未在任何地方提及的非常具体的方面。在这两种情况下:托管(在这种情况下为 NET 运行时)和本机/非托管(c、cpp 等)

取自这里: https://adamsitnik.com/Value-Types-vs-Reference-Types https://i.stack.imgur.com/0Qtnu.png

在此处输入图像描述

第一个不仅没有被掩盖甚至没有提到的问题是您的代码/运行时应该如何知道您正在处理的结构类型?如果 struct 只是将所有数据打包在一起,那么关于它是什么类型的 struct 的元数据在哪里?好的,在托管 .NET 运行时和二进制文件的情况下,它更容易,它是 IL 的一部分,但是本机二进制代码呢?它被剥离 100%,如果您打开它进行文本阅读,那么二进制文件中没有函数或结构名称。如果没有结构元数据,您将如何知道运行时收到的结构以及如何处理/解析它?指针只指向内存,但没有存储结构和成员。至少类可以通过它拥有的额外数据(对象头和方法表)来识别。

当您从非托管/本机空间接收结构数据时,事情会变得更加混乱。您需要将该数据嵌入到结构中,否则您怎么知道收到了什么?而且我什至无法理解* 这对于类之类的东西是如何工作的,因为它们要复杂千倍。您甚至如何从非托管空间返回课程?

标签: c#c++memory

解决方案


如果 struct 只是将所有数据打包在一起,那么关于它是什么类型的 struct 的元数据在哪里?

没有。对于原始值数据——无论是单个值,还是数组/向量/其他,消费代码都是知道如何解释它的东西。它只是:字节。

如果没有结构元数据,您将如何知道运行时收到的结构以及如何处理/解析它?

因为它是在 API 中定义的,要么在签名中,要么用人类的话,例如“指针指向len类型元素的开始Foo

您需要将该数据嵌入到结构中

不,你没有;您只需要事先同意您发送/接收的内容。这就是不同代码库之间绝大多数交互的工作方式,并且一直有效。拥有对象元数据是例外,而不是常态。

您甚至如何从非托管空间返回课程?

你不会,如果在这种情况下“类”是指托管对象。


推荐阅读