感谢原作者:C# 调用C++DLL传递的bool型,返回混乱
原因:C++中bool占一个字节,C#中bool占4个字节
解决方法:将C++中的bool该为BOOL,或C#中的bool该为byte
原因:统一变量所占地址空间大小。C++中BOOL与C#中bool同样占用4个字节,C#中byte与C++中bool同样占用一个字节。
C++中定义如下结构体
struct MYSTRUCT
{
int a;
int b;
float c;
bool d;
}
sizeof(MYSTRUCT) == 16;
sizeof(int)*2+sizeof(float)+sizeof(bool) ==13;
二者不相等:编译器会对结构体进行处理时,会进行字节对齐,以加快计算机取数速度。
字节对齐:max(max(sizeof(int),sizeof(float)),sizeof(bool)) == 4;sizeof(MYSTRUCT)应为4的整数倍取16;即:(13+(4-1))/4*4 ==16
若该为如下
struct MYSTRUCT
{
int a;
int b;
float c;
bool d;
bool e;
}
sizeof(int)*2+sizeof(float)+sizeof(bool)*2 ==14;
sizeof(MYSTRUCT) == 16;即(14+(4-1))/4*4 == 16
同样若是如下结构体
struct MYSTRUCT
{
double a;
int b;
bool e;
}
max(max(sizeof(double),sizeof(int)),sizeof(bool)) == 8;
sizeof(double)+sizeof(int)+sizeof(bool) == 13;
sizeof(MYSTRUCT) == (13+(8-1))/8*8 == 16;
C#中定义如下结构
struct MYSTRUCT
{
public int a;
public int b;
public float c;
public bool d;
}
Marshal.SizeOf(typeof(MYSTRUCT)) == 16;
与C++相同,但bool所占字节不同,
(MYSTRUCT)Marshal.PtrToStructure((IntPtr)((UInt32)ptrRsult), typeof(MYSTRUCT));
转换时可能导致混乱。