다음을 통해 공유


방법: C++ Interop를 사용하여 포함 포인터 마샬링

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

예제

다음 예제에서는 포인터를 포함하는 구조체를 매개 변수로 사용하는 관리되지 않는 함수를 관리되는 함수에서 호출할 수 있는 이유를 보여 줍니다.관리되는 함수에서는 구조체의 인스턴스를 만들고 포함된 포인터를 ref new, gcnew(C++ 구성 요소 확장) 키워드 대신 new 키워드로 초기화합니다.이렇게 하면 메모리가 네이티브 힙에서 할당되므로 가비지 수집을 막기 위해 배열을 고정시킬 필요가 없습니다.그러나 메모리 누수를 피하려면 메모리를 명시적으로 삭제해야 합니다.

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

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

// unmanaged struct
struct ListStruct {
   int count;
   double* item;
};

#pragma unmanaged

void UnmanagedTakesListStruct(ListStruct list) {
   printf_s("[unmanaged] count = %d\n", list.count);
   for (int i=0; i<list.count; i++)
      printf_s("array[%d] = %f\n", i, list.item[i]);
}

#pragma managed

int main() {
   ListStruct list;
   list.count = 10;
   list.item = new double[list.count];

   Console::WriteLine("[managed] count = {0}", list.count);
   Random^ r = gcnew Random(0);
   for (int i=0; i<list.count; i++) {
      list.item[i] = r->NextDouble() * 100.0;
      Console::WriteLine("array[{0}] = {1}", i, list.item[i]);
   }

   UnmanagedTakesListStruct( list );
   delete list.item;
}
  

참고 항목

참조

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