방법: C++ Interop를 사용하여 유니코드 문자열 마샬링How to: Marshal Unicode Strings Using C++ Interop

이 항목에서는 시각적 C++ 상호 운용성의 한 가지 측면을 보여 줍니다.This topic demonstrates one facet of Visual C++ interoperability. 자세한 내용은 Interop 사용 C++ (암시적 PInvoke)을 참조 하세요.For more information, see Using C++ Interop (Implicit PInvoke).

다음 코드 예제에서는 관리 되는 관리 되지 않는 #pragma 지시문을 사용 하 여 동일한 파일에서 관리 되는 함수 및 관리 되지 않는 함수를 구현 하지만 이러한 함수는 별도의 파일에 정의 된 경우와 동일한 방식으로 상호 운용 됩니다The following code examples use the managed, unmanaged #pragma directives to implement managed and unmanaged functions in the same file, but these functions interoperate in the same manner if defined in separate files. 관리 되지 않는 함수만 포함 하는 파일은 /clr (공용 언어 런타임 컴파일)을 사용 하 여 컴파일할 필요가 없습니다.Files containing only unmanaged functions do not need to be compiled with /clr (Common Language Runtime Compilation).

이 항목에서는 관리 되는 함수에서 관리 되지 않는 함수로 유니코드 문자열을 전달 하는 방법 및 그 반대로를 전달 하는 방법을 보여 줍니다.This topic demonstrates how Unicode strings can be passed from a managed to an unmanaged function, and vice versa. 다른 문자열 형식과의 상호 운용을 위해 다음 항목을 참조 하십시오.For interoperating with other strings types, see the following topics:

예제Example

관리 되는 함수에서 관리 되지 않는 함수로 유니코드 문자열을 전달 하기 위해 PtrToStringChars 함수 (Vcclr에 선언 됨)를 사용 하 여 관리 되는 문자열이 저장 된 메모리에서에 액세스할 수 있습니다.To pass a Unicode string from a managed to an unmanaged function, the PtrToStringChars function (declared in Vcclr.h) can be used to access in the memory where the managed string is stored. 이 주소는 네이티브 함수에 전달 되기 때문에 관리 되지 않는 함수가 실행 되는 동안 가비지 수집 사이클이 발생 해야 하는 경우에는 메모리를 pin_ptr (C++/cli) 로 고정 하 여 문자열 데이터의 위치가 다시 지정 되지 않도록 해야 합니다.Because this address will be passed to a native function, it is important that the memory be pinned with pin_ptr (C++/CLI) to prevent the string data from being relocated, should a garbage collection cycle take place while the unmanaged function executes.

// 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 );
}

예제Example

다음 예제에서는 관리 되지 않는 함수에서 호출 하는 관리 되는 함수의 유니코드 문자열에 액세스 하는 데 필요한 데이터 마샬링을 보여 줍니다.The following example demonstrates the data marshaling required to access a Unicode string in a managed function called by an unmanaged function. 네이티브 유니코드 문자열을 수신 하는 관리 되는 함수는 PtrToStringUni 메서드를 사용 하 여 관리 되는 문자열로 변환 합니다.The managed function, on receiving the native Unicode string, converts it to a managed string using the PtrToStringUni method.

// 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();
}

참고 항목See also

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