Marshaling - 它是什么,为什么我们需要它?

时间:2010-02-10 22:23:47

标签: c# .net unmanaged marshalling managed

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

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

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

6 个答案:

答案 0 :(得分:67)

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

答案 1 :(得分:15)

.NET代码(C#,VB)被称为"托管"因为它管理着"通过CLR(Common Language Runtime

如果您使用C或C ++或汇编程序编写代码,则会全部调用" unmanaged",因为不涉及CLR。您负责所有内存分配/解除分配。

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

答案 2 :(得分:10)

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

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

答案 3 :(得分:6)

正如Vinko在评论中所说,你可以在没有任何特殊编组的情况下传递原始类型。这些被称为“blittable”类型,包括byte,short,int,long等类型以及它们的无符号对应类型。

此页面包含blittable and non-blittable types

的列表

答案 4 :(得分:4)

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

答案 5 :(得分:1)

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