11

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

函数需要的结构中有两个无符号字符变量(HostMachineAddress,HostProgramVersion),当我尝试从 c# 调用它时,似乎我“松散”了最后一个字节......如果我将下面 c# 结构中的 SizeConst 更改为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);
4

1 回答 1

6

您的 C# 结构的布局与 C++ 的布局不同(HostProgramVersion 应该是最后一个)。

也适用于编组为ByValTStruse的字符串[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

缺少最后一个字节的问题可能是编组器尝试将 null 附加到您的字符串(如在以 null 结尾的字符串中)。尝试使用sbyte[]+ByValArray而不是字符串。

于 2011-03-07T15:48:38.220 回答