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