[MarshalAs(UnmanagedType.…)] 특성(attribute)입니다.UnmanagedType.I1 의 의미I1 = signed 1-byte integerchar (보통 1바이트 정수형)과 매핑됩니다.bool 같은 값을 char 또는 int8_t로 반환하는 경우, 이를 C#에서 정확히 받으려면 지정해 줘야 합니다.예를 들어 DLL 함수가 이렇게 생겼다고 해봅시다:
extern "C" __declspec(dllexport) char MyFunc();
이 함수는 1바이트 값을 리턴합니다. 그런데 C#에서는 기본 bool이 4바이트(Int32) 로 마샬링되는 게 기본이어서, 그냥 bool을 쓰면 값이 꼬일 수 있습니다.
이때:
[return: MarshalAs(UnmanagedType.I1)]
[DllImport("MyDll.dll")]
public static extern bool MyFunc();
이렇게 쓰면 C#에서 MyFunc()의 반환값을 1바이트짜리 bool로 정확하게 해석합니다.
MarshalAs를 지정하지 않으면 C#은 bool ↔ C/C++ 타입을 4바이트 기준(BOOL 타입)으로 변환합니다.
결과적으로:
char로 1을 반환해도, C#에서 잘못 해석해 false로 나올 수 있음.return: MarshalAs(UnmanagedType.I1)BOOL(4바이트)인지 char/bool(1바이트)인지 확실히 구분해야 올바르게 써야 합니다.