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에 사용 가능하다.




*) Windows Data Types - MSDN

*) MarshalAsAttribute Class - MSDN

*) UnmanagedType 열거형 - MSDN

*) How to map Win32 types to C# types when using P/Invoke? - stackoverflow



@

Posted by six605
,