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,這裏是傳送門

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