编组 – 这是什么,为什么我们需要它?
什么是编组,为什么我们需要它?
我发现很难相信我不能从C#发送一个int
到C,并且必须编组。 为什么C#不能直接发送32位的开始和终止信号,告诉C代码它已经收到一个int
?
如果有什么好的教程或网站说明为什么我们需要编组以及如何使用它,那就太棒了。
因为不同的语言和环境具有不同的调用约定,不同的布局约定,不同大小的基元(参见C#中的char
和C中的char
),不同的对象创build/销毁约定以及不同的devise准则。 你需要一种方法把这些东西从受pipe理的土地上带到一个无人pipe理的土地可以看到和理解的地方,反之亦然。 这是编组的目的。
.NET代码(C#,VB)被称为“托pipe”,因为它是由CLR( 公共语言运行时 )“pipe理”
如果你用C或C ++或汇编编写代码,它们都被称为“非托pipe”,因为不涉及CLR。 你负责所有的内存分配/取消分配。
Marshaling是托pipe代码和非托pipe代码之间的过程; 这是CLR提供的最重要的服务之一。
编组一个int
就像你所说的那样:将内存从CLR的托pipe堆栈复制到C代码可以看到的地方。 编组string,对象,数组和其他types是很困难的事情。
但是P / Invoke互操作层为您处理几乎所有这些事情。
正如Vinko在评论中所说,你可以传递原始types而不需要任何特殊的编组。 这些被称为“blittable”types,包括像byte,short,int,long等types和它们的无符号types。
这个页面包含blittable和non-blittabletypes的列表。
编组是一个更好的词汇或网关,与非托pipe世界的数据types进行沟通,反之亦然,通过使用pinvoke,并确保数据以安全的方式返回,是一个“媒介”。