C#에서 특성을 사용하여 C/C++ 공용 구조체를 만드는 방법

특성을 사용하여 메모리에서 구조체가 레이아웃되는 방식을 필요에 맞게 변경할 수 있습니다. 예를 들어 StructLayout(LayoutKind.Explicit)FieldOffset 특성을 사용하여 C/C++에서 공용 구조체로 알려진 항목을 만들 수 있습니다.

이 코드 세그먼트에서 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;
}

두 개의 정수 필드 i1i2는 함께 lg와 동일한 메모리 위치를 공유합니다. lg가 처음 8바이트를 사용하거나, i1이 처음 4바이트를 사용하고 i2가 다음 4바이트를 사용합니다. 구조체 레이아웃에 대한 이러한 종류의 제어는 플랫폼 호출을 사용할 때 유용합니다.

참고 항목