Alignement incorrect ou chevauchement avec une erreur de champ non-object

J’essaie de créer la structure suivante:

[StructLayout(LayoutKind.Explicit, Size=14)] public struct Message { [FieldOffset(0)] public ushort X; [FieldOffset(2)] [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)] private ushort[] Y; [FieldOffset(12)] public ushort Z; } 

et j’obtiens l’erreur suivante:

Impossible de charger le type ‘Message’ à partir de l’assembly, car il contient un champ d’object situé au décalage 4, aligné de manière incorrecte ou recouvert par un champ non-object.

Est-ce que quelqu’un sait pourquoi cela cause une erreur?

Remarque: je ne peux pas utiliser Pack car je travaille avec le framework compact. Merci.

Le CF Marshaler n’est pas très bon dans ce genre de chose et ce que vous tentez de faire n’est pas pris en charge. Le problème est qu’il sait que le premier élément n’est pas aligné, mais il semble ne pas comprendre que chaque élément du tableau serait également non aligné.

Vous pouvez voir que le comportement fonctionne dans cet exemple:

 [StructLayout(LayoutKind.Explicit, Size = 14)] public struct Message { [FieldOffset(0)] public ushort X; [FieldOffset(2)] private ushort Y1; [MarshalAs(UnmanagedType.LPArray)] [FieldOffset(4)] private ushort[] Y2; [FieldOffset(12)] public ushort Z; } 

Pour ce type de structure, je n’ai jamais laissé le marshaler essayer de gérer chacun des membres. La structure est petite, séparez chaque élément de la manière suivante:

 [StructLayout(LayoutKind.Explicit, Size = 14)] public struct Message { [FieldOffset(0)] public ushort X; [FieldOffset(2)] private ushort Y1; [FieldOffset(4)] private ushort Y2; [FieldOffset(6)] private ushort Y3; [FieldOffset(8)] private ushort Y4; [FieldOffset(10)] private ushort Y5; [FieldOffset(12)] public ushort Z; } 

ou utilisez une “union” simulée comme ceci:

 public struct Y { public ushort a; public ushort b; public ushort c; public ushort d; public ushort e; } [StructLayout(LayoutKind.Explicit, Size = 14)] public struct Message { [FieldOffset(0)] public ushort X; [FieldOffset(2)] private YY; [FieldOffset(12)] public ushort Z; } 

Le problème se produit parce que votre tableau chevauche “X”. ulong, en C #, est UInt64 (en C ++, ulong est UInt32), il s’agit donc de 8 octets.

Si vous changez votre deuxième FieldOffset en 8 ou changez X en uint, cela disparaîtra.