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;
}
두 개의 정수 필드 i1
및 i2
는 함께 lg
와 동일한 메모리 위치를 공유합니다. lg
가 처음 8바이트를 사용하거나, i1
이 처음 4바이트를 사용하고 i2
가 다음 4바이트를 사용합니다. 구조체 레이아웃에 대한 이러한 종류의 제어는 플랫폼 호출을 사용할 때 유용합니다.
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET