103

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

我很难相信我不能通过int线路从 C# 发送到 C 并且必须编组它。为什么 C# 不能只发送 32 位的起始和终止信号,告诉 C 代码它已收到一个int

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

4

6 回答 6

83

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

于 2010-02-10T22:26:28.143 回答
34

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

如果您使用 C 或 C++ 或汇编程序编写代码,则它们都称为“非托管”,因为不涉及 CLR。您负责所有内存分配/取消分配。

编组是托管代码和非托管代码之间的过程;它是CLR提供的最重要的服务之一。

于 2016-04-07T15:44:43.523 回答
11

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

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

于 2010-02-10T22:27:18.643 回答
9

正如 Vinko 在评论中所说,您可以传递原始类型而无需任何特殊编组。这些被称为“blittable”类型,包括 byte、short、int、long 等类型及其无符号对应类型。

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

于 2010-02-10T22:38:56.960 回答
7

编组是需要更好的词或网关的“媒介”,通过使用 pinvoke 与非托管世界的数据类型进行通信,反之亦然,并确保数据以安全的方式返回。

于 2010-02-10T22:37:42.513 回答
3

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

于 2019-01-05T19:11:12.693 回答