Создание объединения C/C++ с помощью атрибутов в C#

С помощью атрибутов можно настраивать расположение структур в памяти. Например, можно создать так называемое объединение в C/C++ с помощью атрибутов StructLayout(LayoutKind.Explicit) и FieldOffset.

В этом сегменте кода все поля объединения TestUnion начинаются с одного адреса в памяти.

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

Следующий код является другим примером, в котором поля начинаются с разных явно заданных расположений.

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

Два целочисленных поля i1 и объединенные используют те же расположения памяти, что lgи i2 . Использует lg первые 8 байтов или i1 использует первые 4 байта и i2 использует следующие 4 байта. Такое управление расположением структуры полезно при использовании вызова неуправляемого кода.

См. также