방법: C++ Interop를 사용하여 유니코드 문자열 마샬링

이 항목에서는 Visual C++ 상호 운용성의 한 가지 측면을 보여 줍니다. 자세한 내용은 C++ Interop 사용(암시적 PInvoke)을 참조하세요.

다음 코드 예제에서는 관리되는 관리되지 않는 #pragma 지시문을 사용하여 동일한 파일에서 관리되는 함수와 관리되지 않는 함수를 구현하지만, 이러한 함수는 별도의 파일에 정의된 경우 동일한 방식으로 상호 운용됩니다. 관리되지 않는 함수만 포함하는 파일은 /clr(공용 언어 런타임 컴파일)을 사용하여 컴파일할 필요가 없습니다.

이 항목에서는 유니코드 문자열을 관리되는 함수에서 관리되지 않는 함수로 전달하는 방법을 보여 줍니다. 다른 문자열 형식과 상호 운용하려면 다음 항목을 참조하세요.

예: 관리되는 함수에서 관리되지 않는 함수로 유니코드 문자열 전달

관리되는 함수에서 관리되지 않는 함수로 유니코드 문자열을 전달하기 위해 PtrToStringChars 함수(Vcclr.h에 선언됨)를 사용하여 관리되는 문자열이 저장된 메모리에 액세스할 수 있습니다. 이 주소는 네이티브 함수에 전달되므로 관리되지 않는 함수가 실행되는 동안 가비지 수집 주기가 발생하는 경우 문자열 데이터가 재배치되지 않도록 메모리를 pin_ptr(C++/CLI)로 고정해야 합니다.

// MarshalUnicode1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>
#include <vcclr.h>

using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(const wchar_t* p) {
   printf_s("(native) received '%S'\n", p);
}

#pragma managed

int main() {
   String^ s = gcnew String("test string");
   pin_ptr<const wchar_t> str = PtrToStringChars(s);

   Console::WriteLine("(managed) passing string to native func...");
   NativeTakesAString( str );
}

예: 유니코드 문자열에 액세스하는 데 필요한 데이터 마샬링

다음 예제에서는 관리되지 않는 함수에서 호출하는 관리되는 함수의 유니코드 문자열에 액세스하는 데 필요한 데이터 마샬링을 보여 줍니다. 네이티브 유니코드 문자열을 수신할 때 관리되는 함수는 메서드를 사용하여 PtrToStringUni 관리되는 문자열로 변환합니다.

// MarshalUnicode2.cpp
// compile with: /clr
#include <iostream>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed

void ManagedStringFunc(wchar_t* s) {
   String^ ms = Marshal::PtrToStringUni((IntPtr)s);
   Console::WriteLine("(managed) received '{0}'", ms);
}

#pragma unmanaged

void NativeProvidesAString() {
   cout << "(unmanaged) calling managed func...\n";
   ManagedStringFunc(L"test string");
}

#pragma managed

int main() {
   NativeProvidesAString();
}

참고 항목

C++ Interop 사용(암시적 PInvoke)