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

by 흥배 2015. 11. 2. 08:00
  • hot 2015.11.04 13:50 ADDR EDIT/DEL REPLY

    윈도우에서 BOOL이 4바이트이고 bool은 1바이트인걸로 아는데 혹시 착각하신건 아닌지요

    • 흥배 2015.11.04 22:18 신고 EDIT/DEL

      네 맞습니다. Windows SDK에는 bool 이라는 타입은 없고 BOOL이 대신 있는데 이게 이야기 하신대로 4바이트죠
      그래서 C#에서 bool로 된 타입을 C++ 코드로 마샬링 하면 BOOL로 인식해서 서로간에 크기 불일치가 생기므로 이 글에서는 c#의 bool 이 C++에서도 1바이트로 처리되도록 속성을 사용했습니다.

| 1 |