Procedimiento para crear una unión de C o C++ mediante atributos en C#

Mediante el uso de atributos, puede personalizar la manera en que los structs se disponen en la memoria. Por ejemplo, puede crear lo que se conoce como una unión en C/ C++ mediante los atributos StructLayout(LayoutKind.Explicit) y FieldOffset.

En este segmento de código, todos los campos de TestUnion empiezan en la misma ubicación en la memoria.

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
    [System.Runtime.InteropServices.FieldOffset(0)]
    public int i;

    [System.Runtime.InteropServices.FieldOffset(0)]
    public double d;

    [System.Runtime.InteropServices.FieldOffset(0)]
    public char c;

    [System.Runtime.InteropServices.FieldOffset(0)]
    public byte b;
}

El código a continuación es otro ejemplo en el que los campos empiezan en ubicaciones diferentes establecidas explícitamente.

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{
    [System.Runtime.InteropServices.FieldOffset(0)]
    public long lg;

    [System.Runtime.InteropServices.FieldOffset(0)]
    public int i1;

    [System.Runtime.InteropServices.FieldOffset(4)]
    public int i2;

    [System.Runtime.InteropServices.FieldOffset(8)]
    public double d;

    [System.Runtime.InteropServices.FieldOffset(12)]
    public char c;

    [System.Runtime.InteropServices.FieldOffset(14)]
    public byte b;
}

Los dos campos enteros, i1 y i2 combinados, tiene las mismas ubicaciones en la memoria que lg. O bien lg usa los primeros 8 bytes o i1 usa los primeros 4 bytes y i2 usa los 4 bytes siguientes. Este tipo de control sobre el diseño del struct es útil cuando se usa la invocación de plataforma.

Vea también