Alineado incorrectamente o superpuesto por un error de campo no objeto

Estoy tratando de crear la siguiente estructura:

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

y me sale el siguiente error:

No se pudo cargar el tipo ‘Mensaje’ desde el ensamblaje porque contiene un campo de objeto en el desplazamiento 4 que está incorrectamente alineado o superpuesto por un campo no objeto.

¿Alguien sabe por qué esto está causando un error?

Nota: No puedo usar Pack porque estoy trabajando con el framework compacto. Gracias.

El CF Marshaler no es tan bueno en este tipo de cosas y lo que estás intentando no es compatible. El problema es que sabe que el primer elemento no está alineado, pero parece no entender que cada elemento de la matriz también estaría desalineado.

Puedes ver que el comportamiento funciona en este ejemplo:

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

Para este tipo de estructura, nunca dejo que el Marshaler intente manejar a cada uno de los miembros de todos modos. La estructura es pequeña, por lo que explique cada elemento individual de esta manera:

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

o use una “unión” simulada como esta:

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

El problema está ocurriendo porque su matriz se superpone a “X”. ulong, en C #, es UInt64 (en C ++, ulong es UInt32), por lo que en realidad es de 8 bytes.

Si cambia su segundo FieldOffset a 8, o cambió X a uint, esto desaparecerá.