2009-08-28 2 views
1

я иметь структуруMarshal.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 было необработанное Message = "Тип„SERVER_USB_DEVICE“ не может быть выстраивали в неуправляемая структура , без значимого размера или смещение может быть вычислено. "

на следующей строке

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

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

Абдул Халик

+0

Покажите нам атрибут с вашей структурой. – adatapost

ответ

7

Когда MarshalAsAttribute.Value установлен в ByValArray, то SizeConst должен быть установлен, чтобы указать количество элементов в массиве. Поле ArraySubType может необязательно содержать UnmanagedType элементов массива, когда необходимо различать типы строк.

Однако я рекомендую вам использовать это вместо:

ByValTStr: Используется для поточных, фиксированной длины символьных массивов, которые появляются в пределах структуры. Тип символа, используемый с ByValTStr, определяется аргументом System.Runtime.InteropServices.CharSetSystem.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; 
} 
Смежные вопросы