我正在为软件的 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);
最佳答案
您的 C# 结构的布局与 C++ 的布局不同(HostProgramVersion 应该在最后)。
对于编码为 ByValTStr
的字符串,也使用 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
。
缺少最后一个字节的问题可能是编码器试图将 null 附加到您的字符串(如在以 null 终止的字符串中)。尝试使用 sbyte[]
+ByValArray
而不是字符串。
关于c# - P/调用,c# : unsigned char losing a byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5221606/