2009-08-28 8 views
1

i ont une structureerreur Marshal.SizeOf taille de calcul

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

J'obtiens l'erreur suivante

System.ArgumentException a été unhandled message = "Type 'SERVER_USB_DEVICE' ne peut pas être marshalé comme une structure non gérée , aucune taille significative ou décalage peut être calculé. "

à la ligne suivante

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

ce qui est faux dans le code?

Abdul Khaliq

+0

Montrez-nous l'attribut avec votre struct. – adatapost

Répondre

7

Lorsque MarshalAsAttribute.Value est réglé sur ByValArray, le SizeConst doit être réglé pour indiquer le nombre d'éléments du tableau. Le champ ArraySubType peut éventuellement contenir le UnmanagedType des éléments du tableau lorsqu'il est nécessaire de différencier les types de chaîne.

Cependant, je vous recommande d'utiliser celui-ci à la place:

ByValTStr: Utilisé pour en ligne, des tableaux de caractères de longueur fixe qui apparaissent dans une structure. Le type de caractère utilisé avec ByValTStr est déterminé par l'argument System.Runtime.InteropServices.CharSet du code System.Runtime.InteropServices.StructLayoutAttribute appliqué à la structure conteneur. Utilisez toujours le champ MarshalAsAttribute.SizeConst pour indiquer la taille de la matrice.

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