Marshal.SizeOf计算大小错误

Abd*_*liq 3 c# structure sizeof marshalling

我有一个结构

 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;
        }
Run Code Online (Sandbox Code Playgroud)

我得到了以下错误

System.ArgumentException未处理Message ="Type'SERVER_USB_DEVICE'无法编组为非托管结构;无法计算有意义的大小或偏移量."

在下面的行

Marshal.SizeOf(typeof(USBOverNetWrapper.FT_SERVER_USB_DEVICE));
Run Code Online (Sandbox Code Playgroud)

代码有什么问题?

阿卜杜勒·卡利克

Sam*_*ell 9

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

但是我建议你改用这个:

ByValTStr:用于出现在结构中的内嵌式固定长度字符数组.与之一起使用的字符类型ByValTStr由应用于包含结构的System.Runtime.InteropServices.CharSet参数 确定 System.Runtime.InteropServices.StructLayoutAttribute.始终使用该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;
}
Run Code Online (Sandbox Code Playgroud)