2011-03-07 29 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

相关问题