Sdílet prostřednictvím


Jak: vložené Marshal ukazatele pomocí C++ Interop

Následující příklady kódu používají managed, unmanaged direktivy # pragma k implementaci spravované a nespravované funkce ve stejném souboru, ale tyto funkce spolupracují stejným způsobem, pokud jsou definovány v samostatných souborech. Soubory, obsahující pouze nespravované funkce, nemusí být kompilovány s /CLR (kompilace společné Language Runtime).

Příklad

Následující příklad ukazuje, jak může být nespravovaná funkce, která přebírá strukturu obsahující ukazatele, volána ze spravované funkce.Spravovaná funkce vytvoří instanci struktury a inicializuje vložený ukazatel s novým klíčovým slovem (namísto klíčového slova ref new, gcnew (rozšíření komponent C++)).Protože to přidělí paměť na nativní haldě, není nutné připnout pole, aby potlačilo uvolňování paměti.Paměť však musí být explicitně odstraněna, abychom se vyhnuli úniku paměti.

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

Viz také

Referenční dokumentace

Použití interoperability C++ (implicitní PInvoke)