编组 - 它是什么以及我们为什么需要它?

87 .net c# unmanaged managed marshalling

什么是编组,我们为什么需要它?

我发现很难相信我不能通过int电线从C#发送到C并且必须对其进行编组.为什么C#只能通过一个起始和终止信号发送32位,告诉C代码它已经收到了int

如果有任何好的教程或网站关于我们为什么需要编组以及如何使用它,那将是很好的.

jas*_*son 72

因为不同的语言和环境具有不同的调用约定,不同的布局约定,不同大小的基元(参见charC#和charC中),不同的对象创建/销毁约定以及不同的设计指南.你需要一种方法将管理的土地中的东西带到一个非管理的土地可以看到并理解它的地方,反之亦然.这就是编组的目的.


小智 19

.NET代码(C#,VB)被称为"托管",因为它由CLR(公共语言运行时)"管理"

如果用C或C++或汇编程序编写代码,则所有代码都称为"非托管",因为不涉及CLR.您负责所有内存分配/解除分配.

封送处理是托管代码和非托管代码之间的过程; 它是CLR提供的最重要的服务之一.


JSB*_*ոգչ 10

编组一个int理想情况就是你所说的:将内存从CLR的托管堆栈复制到C代码可以看到的地方.编组字符串,对象,数组和其他类型是困难的事情.

但是P/Invoke互操作层会为您处理几乎所有这些事情.

  • 编组实际上是在做复制操作吗?我正在研究实时图像处理操作,并且宁愿不必复制内存中的所有内容。 (3认同)

Jos*_*osh 6

正如Vinko在评论中所说,你可以传递原始类型,而无需任何特殊的编组.这些被称为"blittable"类型,包括byte,short,int,long等类型以及它们的无符号对应类型.

此页面包含blittable和non-blittable类型的列表.


t0m*_*13b 5

编组是一种缺少“单词”或“网关”的“媒介”,它通过使用点名功能来与非托管世界的数据类型进行通信,反之亦然,并确保数据以安全的方式返回。