Marshal.SizeOf计算大小错误

时间:2009-08-28 05:28:31

标签: c# marshalling structure sizeof

我有一个结构

 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

2 个答案:

答案 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{
         ....
     }

http://msdn.microsoft.com/en-us/library/5s4920fa.aspx