在C#与C++进行交互时,经常需要相互传值,下面就来谈一谈我在传值时遇到的几个问题:
bool值传递,C#传递bool值到C++中时,传递的并非一个字节,而是4个字节,
[StructLayout(LayoutKind.Sequential, Pack = 1), Serializable]
public class classA
{
public Boolean bShowWindow;
public Booleam bBroadCast;
}
ClassA a = new ClassA()
{
bShowWindow = true,
bBroadCast = true
};
正常来说,传递到C++中时, a.bShowWindow =true , a.bBroadCast = true
才对,但实际上,我多次测试都发现 a.bBroadCast = true,a.bShowWindow = false
(这里true,false与想象中的相反是因为C#内存排布的问题),而并非两个都为true
,
详细查看内存后发现,a.bShowWindow
对应的内存全为0,开始怀疑是变量长度的问题,使用[MarshalAs(UnmanagedType.U1)]
强制 两个成员为1字节后,正确传递值;
[MarshalAs(UnmanagedType.U1)]
public Boolean bShowWindow;
[MarshalAs(UnmanagedType.U1)]
public Boolean bBroadCast;
代码里边,bool值是1个字节的
托管代码转非托管代码时,bool是4个字节的
UnmanagedType Enum
emm,不是很清楚为什么这两个地方bool值的长度是不一样的,在没有查明原因前,先记住这个坑
C#向C++传递 char[]数组时,不能使用 char[] a= new char[11]
这种写法,
需要这样:
public class classA
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string IP;
}
下面这种写法会报错,System.Runtime.InteropServices.SafeArrayTypeMismatchException: Specified array was not of the expected type.
public class classA
{
char[] a= new char[16]
}
这个解决方案是来自stackoverflow,这里是传送门