다음을 통해 공유


방법: C++ Interop를 사용하여 ANSI 문자열 마샬링

이 항목에서는 C++ Interop을 사용하여 ANSI 문자열을 전달할 수 있지만 .NET Framework String 는 유니코드 형식의 문자열을 나타내므로 ANSI로의 변환은 추가 단계입니다. 다른 문자열 형식과 상호 운용하려면 다음 항목을 참조하세요.

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

예: ANSI 문자열 전달

이 예제에서는 관리되는 함수에서 관리되지 않는 함수로 ANSI 문자열을 전달하는 방법을 보여 줍니다 StringToHGlobalAnsi. 이 메서드는 관리되지 않는 힙에 메모리를 할당하고 변환을 수행한 후 주소를 반환합니다. 즉, 고정이 필요하지 않으며(GC 힙의 메모리가 관리되지 않는 함수에 전달되지 않기 때문에) 반환 StringToHGlobalAnsi 된 IntPtr이 명시적으로 해제되거나 메모리 누수 결과가 발생합니다.

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

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

#pragma unmanaged

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

#pragma managed

int main() {
   String^ s = gcnew String("sample string");
   IntPtr ip = Marshal::StringToHGlobalAnsi(s);
   const char* str = static_cast<const char*>(ip.ToPointer());

   Console::WriteLine("(managed) passing string...");
   NativeTakesAString( str );

   Marshal::FreeHGlobal( ip );
}

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

다음 예제에서는 관리되지 않는 함수에서 호출되는 관리되는 함수의 ANSI 문자열에 액세스하는 데 필요한 데이터 마샬링을 보여 줍니다. 네이티브 문자열을 수신할 때 관리되는 함수는 표시된 것처럼 직접 사용하거나 메서드를 사용하여 PtrToStringAnsi 관리되는 문자열로 변환할 수 있습니다.

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

using namespace std;

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

#pragma managed

void ManagedStringFunc(char* s) {
   String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s));
   Console::WriteLine("(managed): received '{0}'", ms);
}

#pragma unmanaged

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

#pragma managed

int main() {
   NativeProvidesAString();
}

참고 항목

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