【问题标题】:P/Invoke, c#: unsigned char losing a byteP/Invoke, c#: unsigned char 丢失一个字节
【发布时间】:2023-03-03 04:53:22
【问题描述】:

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

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

【问题讨论】:

  • 为什么 HostProgramVersion 和 szHostProgramName 在你的 C# 代码中被交换了?

标签: c# pinvoke marshalling unsigned-char


【解决方案1】:

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

对于编组为ByValTStr 的字符串,也可以使用[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

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

【讨论】:

  • +1 另外,我总是指定StructLayoutAttribute.Pack,即使它在这里不相关。养成一个好习惯。
  • 对不起,我关于交换变量的错误,但是恐怕没有解决问题,还添加了 Charset.Ansi。
  • @Tistatos:再次查看您的代码,您似乎正在存储 IPv4 地址/4 位 prog.version?这意味着 4 字符数组真的应该是 sbyte 数组?!
  • 是 它存储托管软件的计算机的 IP 地址。所以基本上我需要的是“ByValArray”谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多