2011-03-07 49 views
10

我正在爲一個軟件的SDK的dll文件工作,我試圖調用一個函數來獲取有關該軟件的主機的信息。P/Invoke,C#:無符號字符丟失一個字節

有兩個無符號的字符變量(HostMachineAddress,HostProgramVersion)在函數想要的結構中,它看起來像我「鬆」最後一個字節,當我嘗試從c#調用它...如果我改變SizeConst下面的C#結構到5我得到丟失的字節,但它導致其他變量丟失數據。

有人能幫我找到一種方法來解決這個問題嗎?還嘗試使用,而不是結構的一類引起system.stackoverflow錯誤

C#結構

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct sHostInfo 
{ 
    public int bFoundHost; 
    public int LatestConfirmationTime; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
    public string szHostMachineName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
    public string HostMachineAddress; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
    public string szHostProgramName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
    public string HostProgramVersion; 
} 

C#

[DllImport("Cortex_SDK.dll")] 
public static extern int GetHostInfo(out sHostInfo pHostInfo); 
+2

爲什麼HostProgramVersion和szHostProgramName在你的C#代碼中交換? – Fox32 2011-03-07 15:47:59

回答

6

你的C#結構的佈局是從C++一個(HostProgramVersion不同應該是最後一次)。

也用於編碼爲ByValTStr的字符串使用[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

最後一個字節丟失的問題可能是編組器試圖向您的字符串追加空(如在以null結尾的字符串中)。嘗試使用sbyte[] + ByValArray而不是字符串。

+1

+1此外,我總是指定'StructLayoutAttribute.Pack',即使它在這裏不相關。一個好習慣。 – 2011-03-07 15:52:44

+0

對不起我關於交換變量的錯誤,但是這並沒有解決我害怕的問題,還添加了Charset.Ansi。 – Tistatos 2011-03-07 15:52:57

+0

@Tistatos:再次查看您的代碼,看起來您正在存儲IPv4地址/ 4位數字的prog.version?這意味着4字符數組應該真的是'sbyte'數組? – 2011-03-07 15:59:08