P / Invoke,c#:unsigned char丢一个字节

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

函数想要的结构体中有两个无符号字符变量(HostMachineAddress,HostProgramVersion),当我尝试从c#…调用它时,我似乎“松开”最后一个字节,如果我将下面的c#struct中的SizeConst更改为5我得到丢失的字节,但是它导致另一个变量丢失数据.

有人可以帮我找到办法解决这个问题吗?也试图使用一个类而不是struct导致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)]).

丢失最后一个字节的问题可能是编组器尝试将空值追加到字符串(如以空字符结尾的字符串).尝试使用sbyte [] ByValArray而不是字符串.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...