Marshal.SizeOf ошибка в размере вычислений - PullRequest
2 голосов
/ 28 августа 2009

у меня есть структура

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

что не так в коде?

Абдул Халик

Ответы [ 2 ]

8 голосов
/ 28 августа 2009

Когда 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;
}
1 голос
/ 28 августа 2009
[StructLayout(LayoutKind.Sequential, Pack = 1)]
     public struct SERVER_USB_DEVICE{
         ....
     }

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

...