C# (Managed code) 에서 C++ DLL (Unmanaged code) 의 다음과 같은 함수를 사용해야 할 경우가 있었다.
C++
void Func(LPCTSTR szKey);
C/C++ 기억이 가물가물 하지만.. LPCTSTR 타입은 다음과 같다.
UNICODE 을 정의할 경우 -> LPCWSTR (16-bit Unicode character) 즉, CONST WCHAR *
ANSI 일 경우 -> LPCSTR (8-bit ANSI character) 즉, CONST CHAR *
*) Windows API 는 ANSI string 과 Unicode (UTF-16) string 을 사용한다.
*) C# 은 Unicode (UTF-16) 을 사용한다.
LPCTSTR 의 대응되는 C# 타입은 [UnmanagedType.LPWStr] string 이다.
C++ C#
LPCTSTR -> [UnmanagedType.LPTStr] string
UnmanagedType 열거형
매개변수나 필드를 Unmanaged 코드로 어떻게 마샬링 할 것인지 지정하는 열거타입
UnmanagedType.LPWSTR
2바이트 null 로 끝나는 유니코드 문자열. Unmanaged 함수인 CoTaskMemAlloc 로 생성된 문자열에 대해서만 사용됨.
ANSI 문자열로 마샬링할 경우에는 UnmanagedType.LPSTR, Unicode 문자열로 마샬링할 경우에는 UnmanagedType.LPWSTR 을 사용하는 것 같다. 플랫폼 종속적인 경우에는 UnmanagedType.LPTSTR 을 사용해되 괜찮을것 같다.
MarshalAsAttribute
Managed 코드와 Unmanaged 코드 사이에 데이터를 어떻게 마샬링 할 것인지 지정한다. parameter, field, return value에 사용 가능하다.
*) MarshalAsAttribute Class - MSDN
*) How to map Win32 types to C# types when using P/Invoke? - stackoverflow
@