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

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

예제

다음 예제에서는 포인터를 포함하는 구조체를 매개 변수로 사용하는 관리되지 않는 함수를 관리되는 함수에서 호출할 수 있는 이유를 보여 줍니다. 관리되는 함수에서는 구조체의 인스턴스를 만들고 포함된 포인터를 gcnew 키워드 대신 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)