我正在努力开发软件SDK的dll文件,我正在尝试调用函数来获取有关软件主机的信息。
在函数所需的结构中有两个unsigned char变量(HostMachineAddress,HostProgramVersion),当我尝试从c#调用它时,我似乎“松散”了最后一个字节...如果我在c#中更改SizeConst结构低于5我确实得到了丢失的字节,但它导致另一个变量丢失数据。
有人可以帮我找到解决这个问题的方法吗?也试图使用类而不是struct导致system.stackoverflow错误
C#Struct
[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);
答案 0 :(得分:6)
你的C#struct的布局与C ++的布局不同(HostProgramVersion应该是最后一个)。
对于作为ByValTStr
编组的字符串,请使用[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
。
缺少最后一个字节的问题可能是marshaller尝试将null追加到字符串中(如在以null结尾的字符串中)。尝试使用sbyte[]
+ ByValArray
而不是字符串。