Sdílet prostřednictvím


Postupy: Zařazení vložených ukazatelů 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 (Common Language Runtime Compilation).

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 gcnew). 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é

Odkaz

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