C# 调用C++DLL传递的bool型,返回混乱

问题: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));

转换时可能导致混乱。

展开阅读全文

没有更多推荐了,返回首页