我遇到了C#和C ++之间互操作的问题,我在这两个方面之间共享内存'我的应用程序通过本机代码和托管代码中定义的结构。本机端的结构定义如下:
#pragma pack(push, 1)
struct RayTestCollisionDesc {
btVector3 hitPosition;
btRigidBody* hitBody;
RayTestCollisionDesc(btRigidBody* body, btVector3& position)
: hitBody(body), hitPosition(position) { }
};
#pragma pack(pop)
在托管(C#)端定义了类似的结构。在C#上,结构大小是20个字节(正如我在32位系统上所期望的那样)。但是,尽管有pragma pack
指令,但C ++大小的结构大小仍为32.为了清楚起见,这些类型中的sizeof()
来自C ++:
sizeof(btVector3) : 16
sizeof(btRigidBody*) : 4
sizeof(RayTestCollisionDesc) : 32
显然pragma pack
仅指结构成员之间的打包,而不是结构末尾的填充(即对齐)。我也尝试添加__declspec(align(1))
但是没有效果,MSDN本身确实说" __ declspec(align(#))只会增加对齐限制。"
FWIW我正在使用VS2013编译器(Platform Toolset v120)。
有没有办法强迫'结构大小为20个字节?
答案 0 :(得分:5)
您正在两个不同的编译器之间传输数据。一般来说,这种匹配是不可能的。特别是如果您将数据从一台计算机传输到另一台计
首先为您要传输的数据编写规范。规范不能是C ++或C#结构。规范必须类似于“四个字节,四个字节,两个字节三分之一......”等等,例如“总共20个字节”。
然后,无论您使用C ++还是C#,或者一个完全不同的开发人员是否使用Objective-C代码来读取数据,您都会读取20个字节的数组,取20个字节,查看它们,并填充您想要的任何结构这20个字节。对于写作,你会做相反的事情。现在无论你使用什么C ++编译器,你正在使用什么奇怪的pragma,它只是起作用。
或使用像JSON这样便携的东西。
答案 1 :(得分:0)
你不能以这种方式互操作。 C#对象和C ++结构是不同的。我建议你使用像Capt'n Proto或Protobuf
这样的序列化库