c# - 用于对象表示和托管/非托管交互的结构/类元数据
问题描述
我知道有很多类似的问题,但我想了解从未在任何地方提及的非常具体的方面。在这两种情况下:托管(在这种情况下为 NET 运行时)和本机/非托管(c、cpp 等)
取自这里:
https://adamsitnik.com/Value-Types-vs-Reference-Types
第一个不仅没有被掩盖甚至没有提到的问题是您的代码/运行时应该如何知道您正在处理的结构类型?如果 struct 只是将所有数据打包在一起,那么关于它是什么类型的 struct 的元数据在哪里?好的,在托管 .NET 运行时和二进制文件的情况下,它更容易,它是 IL 的一部分,但是本机二进制代码呢?它被剥离 100%,如果您打开它进行文本阅读,那么二进制文件中没有函数或结构名称。如果没有结构元数据,您将如何知道运行时收到的结构以及如何处理/解析它?指针只指向内存,但没有存储结构和成员。至少类可以通过它拥有的额外数据(对象头和方法表)来识别。
当您从非托管/本机空间接收结构数据时,事情会变得更加混乱。您需要将该数据嵌入到结构中,否则您怎么知道收到了什么?而且我什至无法理解* 这对于类之类的东西是如何工作的,因为它们要复杂千倍。您甚至如何从非托管空间返回课程?
解决方案
如果 struct 只是将所有数据打包在一起,那么关于它是什么类型的 struct 的元数据在哪里?
没有。对于原始值数据——无论是单个值,还是数组/向量/其他,消费代码都是知道如何解释它的东西。它只是:字节。
如果没有结构元数据,您将如何知道运行时收到的结构以及如何处理/解析它?
因为它是在 API 中定义的,要么在签名中,要么用人类的话,例如“指针指向len
类型元素的开始Foo
”
您需要将该数据嵌入到结构中
不,你没有;您只需要事先同意您发送/接收的内容。这就是不同代码库之间绝大多数交互的工作方式,并且一直有效。拥有对象元数据是例外,而不是常态。
您甚至如何从非托管空间返回课程?
你不会,如果在这种情况下“类”是指托管对象。
推荐阅读
- java - 为什么我的 do-while 循环在 Java 中过早中断?
- html - CSS:如果同级输入没有值,则选择标签并更改颜色
- r - 在 ggplot2 中创建华夫饼图和构面
- javascript - 如何在 HTML 按钮单击上安装反应应用程序
- homebrew - 如何在 Mac OS X Mojave (10.14) 上安装 zlib?
- mysql - MySQL 触发器 - 5.7.23-0ubuntu0.16.04.1 - 奇怪的行为并非每次都有效
- php - 如果产品变体包含此短语,则执行此操作
- cordova - 由于 SslErrorHandler,Playstore 拒绝了 ionic (cordova) 应用程序
- batch-file - 合并后重命名文件,以避免再次使用它们
- python - 无法在 python 3.7 中安装包“重试”