我有一个结构
public struct SERVER_USB_DEVICE
{
USB_HWID usbHWID;
byte status;
bool bExcludeDevice;
bool bSharedManually;
ulong ulDeviceId;
ulong ulClientAddr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
string usbDeviceDescr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
string locationInfo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
string nickName;
}
我收到以下错误
System.ArgumentException未处理 消息=“类型'SERVER_USB_DEVICE' 不能作为一个无人管理的集合 结构体;没有意义的大小或 可以计算偏移量。“
在以下行
Marshal.SizeOf(typeof(USBOverNetWrapper.FT_SERVER_USB_DEVICE));
代码有什么问题?
Abdul Khaliq
答案 0 :(得分:8)
当
MarshalAsAttribute.Value
设置为ByValArray
时,必须设置SizeConst
以指示数组中的元素数。 当需要区分字符串类型时,ArraySubType
字段可以选择包含数组元素的UnmanagedType
。
但我建议你改用这个:
ByValTStr
:用于显示在结构中的内嵌式固定长度字符数组。与ByValTStr
一起使用的字符类型由应用于包含结构的System.Runtime.InteropServices.CharSet
的{{1}}参数确定。始终使用System.Runtime.InteropServices.StructLayoutAttribute
字段指示数组的大小。
MarshalAsAttribute.SizeConst
答案 1 :(得分:1)
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SERVER_USB_DEVICE{
....
}