C# 调用C++DLL传递的bool型,返回混乱
2016-12-21 13:10
489 查看
转载自:http://blog.csdn.net/z397164725/article/details/8258541
原因: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));
转换时可能导致混乱。
原因: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));
转换时可能导致混乱。
相关文章推荐
- C# 调用C++DLL传递的bool型,返回混乱
- C# 调用C++DLL传递的bool型,返回混乱(c++为false,c#确为ture)
- C# 调用C++DLL传递的bool型,返回混乱
- Unity使用C#调用C++dll传递指针参数、接收指针返回值
- C# 调用C++ dll 方法返回char* 乱码
- c#调用c++写成的dll文件,返回char*,返回数组,用ref接收,byte[] (zz)
- c#调用c++写成的dll文件,返回char*,返回数组,用ref接收,byte[]
- C#程序调用C++写的dll传递string出现bad ptr
- C#调用C++DLL,正确接收与传递中文字符方法
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题
- c# 传递Null的string值导致的调用C++的dll报错 Attempted to read or write protected memory.
- C#调用C++生成的Dll库,Dll使用callback向C#传递指针
- c#调用C++写的DLL,传递二维指针参数
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题(zz)
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题
- 关于C#中调用C++dll传递回调函数的问题
- C#调用C++dll 结构体参数传递问题
- CE下,c#调用c++DLL字符串传递
- C#调用C++DLL,及回调函数、string参数传递的总结
- C# 调用C++ DLL 返回类型为字符的接口 出现异常 解决办法