Cómo: Calcular las referencias de punteros incrustados mediante la interoperabilidad de C++

En los siguientes ejemplos de código, se utilizan las directivas #pragma managed, unmanaged para implementar funciones administradas y no administradas en el mismo archivo, pero sin que éstas dejen de interactuar como si se hubieran definido en archivos separados.No es necesario compilar con /clr (Compilación de Common Language Runtime) los archivos que contienen únicamente funciones no administradas.

Ejemplo

El ejemplo siguiente muestra cómo se puede llamar a una función no administrada que toma una estructura que contiene punteros desde una función administrada.La función administrada crea una instancia de la estructura e inicializa el puntero incrustado con la nueva palabra clave (en lugar de la palabra clave ref new, gcnew (Extensiones de componentes de C++)).Dado que así se asigna la memoria en el montón nativo, no hay ninguna necesidad de anclar la matriz para suprimir la recolección de elementos no utilizados.Sin embargo, la memoria se debe eliminar explícitamente para evitar pérdidas en ella.

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

Vea también

Referencia

Utilizar la interoperabilidad de C++ (PInvoke implícito)