views:

599

answers:

2

i have a structure

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

i am getting following error

System.ArgumentException was unhandled Message="Type 'SERVER_USB_DEVICE' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed."

at following line

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

what is wrong in the code?

Abdul Khaliq

A: 
[StructLayout(LayoutKind.Sequential, Pack = 1)]
     public struct SERVER_USB_DEVICE{
         ....
     }

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

adatapost
+2  A: 

When MarshalAsAttribute.Value is set to ByValArray, the SizeConst must be set to indicate the number of elements in the array. The ArraySubType field can optionally contain the UnmanagedType of the array elements when it is necessary to differentiate among string types.

However I recommend you use this one instead:

ByValTStr: Used for in-line, fixed-length character arrays that appear within a structure. The character type used with ByValTStr is determined by the System.Runtime.InteropServices.CharSet argument of the System.Runtime.InteropServices.StructLayoutAttribute applied to the containing structure. Always use the MarshalAsAttribute.SizeConst field to indicate the size of the array.

[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;
}
280Z28