C#向C++传递值时变量长度不一致的问题

在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,这里是传送门

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章