4

我有一个结构

 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 未处理 Message="Type 'SERVER_USB_DEVICE' 无法作为非托管结构封送;无法计算有意义的大小或偏移量。"

在下一行

Marshal.SizeOf(typeof(USBOverNetWrapper.FT_SERVER_USB_DEVICE));

代码有什么问题?

阿卜杜勒哈利克

4

2 回答 2

10

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

但是,我建议您改用这个:

ByValTStr: 用于出现在结构中的内联、固定长度的字符数组。使用的字符类型由应用于包含结构的参数 ByValTStr确定 。始终使用该字段来指示数组的大小。System.Runtime.InteropServices.CharSetSystem.Runtime.InteropServices.StructLayoutAttributeMarshalAsAttribute.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;
}
于 2009-08-28T05:53:15.690 回答
3
[StructLayout(LayoutKind.Sequential, Pack = 1)]
     public struct SERVER_USB_DEVICE{
         ....
     }

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

于 2009-08-28T05:46:28.857 回答