검색결과 리스트
StructLayout에 해당되는 글 1건
- 2015.11.02 [.NET] C++과 C# 간에 구조체를 마셜링 할 때 bool 타입의 크기 문제 (3)
C++에서 정의한 아래 구조체를
struct example {
int a;
bool b;
bool c;
int d;
int e;
}:
(Windows 환경에서)C#에서 아래와 같이 마셜링 하면 버그가 발생한다
[StructLayout(LayoutKind.Sequential)]
struct ExampleCS
{
public int a;
public bool b;
public bool c;
public int d;
public int e;
}
버그는 C++에서 넘긴 것과 C#에서 받은 값이 서로 다르다.
이유는 C#에서는 bool이 1byte 이지만, C++로 마셜링하면 BOOL(4byte)로 인식하기 때문이다.
(Windows SDK에서 bool 이라는 타입은 없고 대신 BOOL을 사용하고 있다)
그래서 아래와 같이 바꾸어야 한다.
[StructLayout(LayoutKind.Sequential)]
struct ExampleCS
{
public int a;
[MarshalAs(UnmanagedType.I1)]
public bool b;
[MarshalAs(UnmanagedType.I1)]
public bool c;
public int d;
public int e;
}
참고: http://qiita.com/_pochi/items/9dc460ee62f7da2d216c
댓글
윈도우에서 BOOL이 4바이트이고 bool은 1바이트인걸로 아는데 혹시 착각하신건 아닌지요
네 맞습니다. Windows SDK에는 bool 이라는 타입은 없고 BOOL이 대신 있는데 이게 이야기 하신대로 4바이트죠
그래서 C#에서 bool로 된 타입을 C++ 코드로 마샬링 하면 BOOL로 인식해서 서로간에 크기 불일치가 생기므로 이 글에서는 c#의 bool 이 C++에서도 1바이트로 처리되도록 속성을 사용했습니다.
Marshal.SizeOf(typeof(bool)) 여기서 바로 1바이트가 반환되게 하는 방법도 있나요?