Pregunta

Estoy intentando 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' del conjunto, ya que contiene un campo de objeto en el offset 4 que está alineado o superpuesto incorrectamente por un campo no objeto.

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

Nota: No puedo usar Paquete porque estoy trabajando con el marco compacto. Gracias.

¿Fue útil?

Solución

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

Puede ver el comportamiento trabaja 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;
}

En este tipo de estructura, nunca dejar que el contador de referencias tratan de manejar cada uno de los miembros de todos modos. La estructura es pequeña, por lo que dividir 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 usar una "unión" simulada como esto:

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

    [FieldOffset(12)]
    public ushort Z;
}

Otros consejos

El problema se produce debido a que su matriz es la superposición de "X". ulong, en C #, es UInt64 (en C ++, ulong es UInt32), por lo que en realidad es de 8 bytes.

Si cambia su segunda FieldOffset a 8, o cambiado a uint X, esto desaparecerá.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top