P/Invoke,c#:丢失一个字节的无符号字符

P/Invoke,c#:丢失一个字节的无符号字符,c#,pinvoke,marshalling,unsigned-char,C#,Pinvoke,Marshalling,Unsigned Char,我正在为一个软件的SDK开发一个dll文件,我正在尝试调用一个函数来获取有关软件主机的信息 函数需要的结构中有两个无符号字符变量(HostMachineAddress、HostProgramVersion),当我试图从c#调用它时,似乎我“松开”了最后一个字节。。。如果我将下面c#结构中的SizeConst更改为5,我确实会得到缺少的字节,但是这会导致其他变量丢失数据 有人能帮我找到解决这个问题的方法吗?尝试使用类而不是结构也会导致system.stackoverflow错误 C#结构 C# 你

我正在为一个软件的SDK开发一个dll文件,我正在尝试调用一个函数来获取有关软件主机的信息

函数需要的结构中有两个无符号字符变量(HostMachineAddress、HostProgramVersion),当我试图从c#调用它时,似乎我“松开”了最后一个字节。。。如果我将下面c#结构中的SizeConst更改为5,我确实会得到缺少的字节,但是这会导致其他变量丢失数据

有人能帮我找到解决这个问题的方法吗?尝试使用类而不是结构也会导致system.stackoverflow错误

C#结构

C#

<>你的C++结构与C++的布局不同(主机程序版本应该是最后一个)。 同样,对于通过Valtstr编组为
的字符串,请使用
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]


缺少最后一个字节的问题可能是封送处理程序试图将null附加到字符串中(如以null结尾的字符串)。尝试使用
sbyte[]
+
ByValArray
而不是字符串。

为什么在C代码中交换HostProgramVersion和szHostProgramName?+1此外,我总是指定
StructLayoutAttribute.Pack
,尽管它在这里不相关。养成一个好习惯。很抱歉,我在交换变量方面犯了错误,但恐怕这并不能解决问题。我还添加了Charset.Ansi。@Tistatos:再次查看您的代码,您似乎正在存储IPv4地址/4位程序版本?这意味着4字符数组真的应该
sbyte
数组?!是,它存储托管软件的计算机的IP地址。所以基本上我需要的是“ByValArray”谢谢
[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;
}
[DllImport("Cortex_SDK.dll")]
public static extern int GetHostInfo(out sHostInfo pHostInfo);