87 .net c# unmanaged managed marshalling
什么是编组,我们为什么需要它?
我发现很难相信我不能通过int
电线从C#发送到C并且必须对其进行编组.为什么C#只能通过一个起始和终止信号发送32位,告诉C代码它已经收到了int
?
如果有任何好的教程或网站关于我们为什么需要编组以及如何使用它,那将是很好的.
jas*_*son 72
因为不同的语言和环境具有不同的调用约定,不同的布局约定,不同大小的基元(参见char
C#和char
C中),不同的对象创建/销毁约定以及不同的设计指南.你需要一种方法将管理的土地中的东西带到一个非管理的土地可以看到并理解它的地方,反之亦然.这就是编组的目的.
JSB*_*ոգչ 10
编组一个int
理想情况就是你所说的:将内存从CLR的托管堆栈复制到C代码可以看到的地方.编组字符串,对象,数组和其他类型是困难的事情.
但是P/Invoke互操作层会为您处理几乎所有这些事情.
正如Vinko在评论中所说,你可以传递原始类型,而无需任何特殊的编组.这些被称为"blittable"类型,包括byte,short,int,long等类型以及它们的无符号对应类型.
此页面包含blittable和non-blittable类型的列表.