封送处理-这是什么,为什么我们需要它?


92

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

我发现很难相信我无法int通过C#向C 发送电汇,而不得不进行封送处理。为什么C#不能只用开始和结束信号发送32位,告诉C代码它已经收到了int

如果有任何很好的教程或网站介绍为什么我们需要编组以及如何使用它,那就太好了。


3
事实上,你可以只在一个起始和终止信号发送32位。那将是编写自己的int编组数据。但是,您如何将Dictionary <CustomClassA,List <CustomClassB >>传递给C代码?
Vinko Vrsalovic 2010年

4
当您说“在线”时,就会想到字节顺序。
user7116 2010年

true可以忽略大/小Endian或任何其他变体。

54
这是一个奇怪的问题。这就像在问“为什么我们需要一个邮政系统,什么时候我们可以简单地使用一个系统,在该系统中,邮递员拿起信件,将其带到中心位置进行分类,然后将其交付给收件人?” 但是...这是一个邮政系统。您问为什么我们本来需要一个编组系统,为什么我们需要一个编组系统。我想我漏掉了你的问题。你能澄清一下吗?
埃里克·利珀特

1
我认为最好的理解方法是了解“方法”在汇编中的工作方式-最后一条指令地址如何保存在堆栈上,参数如何通过堆栈传递,堆栈指针寄存器由方法修改,指令指针使用寄存器,尤其是在实现方法的不同技术中如何略有不同。实际上,理解“导线”应该可以为您的问题提供一些启示。
ylax

Answers:


75

由于不同的语言和环境具有不同的调用约定,不同的布局约定,不同大小的基元(请参见charC#和charC),不同的对象创建/销毁约定以及不同的设计准则。您需要一种方法来将这些东西从管理土地中带入非管理土地可以看到和理解的地方,反之亦然。这就是编组的目的。


25

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

如果您使用C或C ++或汇编器编写代码,由于不涉及CLR,因此统称为“非托管”。您负责所有内存分配/取消分配。

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


11

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

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


2
封送处理实际上是在执行复制操作吗?我正在查看实时图像处理操作,希望不必复制内存中的所有内容。
ias

7

正如Vinko在评论中所说,您可以传递原始类型而无需任何特殊的编组。这些称为“可迁移”类型,包括字节,短型,整型,长型等类型,以及它们的无符号对应类型。

此页面包含blittable和nonblittable类型的列表。


7

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


2

编组将功能的签名传递给不同机器上的不同进程,并且通常通过将结构化数据转换为专用格式来实现,该格式可以转移到其他处理器系统(串行化/反串行化)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.