【问题标题】:Marshal.SizeOf error in computing sizeMarshal.SizeOf 计算大小错误
【发布时间】:2009-08-28 05:28:31
【问题描述】:

我有一个结构

 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));

代码有什么问题?

阿卜杜勒·哈利克

【问题讨论】:

  • 向我们展示你的结构的属性。

标签: c# marshalling structure sizeof


【解决方案1】:

MarshalAsAttribute.Value 设置为ByValArray 时,SizeConst 必须设置为指示数组中元素的数量。 当需要区分字符串类型时,ArraySubType 字段可以选择包含数组元素的UnmanagedType

不过我建议你改用这个:

ByValTStr:用于出现在结构中的内联、固定长度的字符数组。 ByValTStr 使用的字符类型由应用于包含结构的System.Runtime.InteropServices.StructLayoutAttributeSystem.Runtime.InteropServices.CharSet 参数确定。始终使用MarshalAsAttribute.SizeConst 字段来指示数组的大小。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
// OR [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SERVER_USB_DEVICE
{
    USB_HWID usbHWID;
    byte status;
    bool bExcludeDevice;
    bool bSharedManually;
    ulong ulDeviceId;
    ulong ulClientAddr;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    string usbDeviceDescr;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    string locationInfo;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    string nickName;
}

【讨论】:

    【解决方案2】:
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
         public struct SERVER_USB_DEVICE{
             ....
         }
    

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

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 2018-05-16
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多