Compartilhar via


Como: realizar realizar marshaling ponteiros Embedded usando interoperabilidade C++

Os exemplos de código a seguir usam o gerenciado, não gerenciado para implementar as diretivas # pragma gerenciado e funções não gerenciadas no mesmo arquivo, mas essas funções interoperam da mesma forma se definidas em arquivos separados. Arquivos que contêm somente funções não gerenciadas não precisam ser compilado com o CLR (ComComummon Idioma Tempo de execução ComComumpilation).

Exemplo

O exemplo a seguir demonstra como uma desinstalação gerenciado função que usa uma estrutura que contêm ponteiros pode ser chamada a partir de um gerenciado função.O gerenciado função cria uma instância da estrutura e inicializa o ponteiro incorporado com a nova palavra-chave (em vez do gcnew palavra-chave). Como isso aloca a memória no heap nativa, não é necessário para fixar a matriz para suprimir lixo coleção.No entanto, a memória deve ser explicitamente excluída para evitar vazamento de memória.

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

[managed] count = 10 array[0] = 72.624326996796 array[1] = 81.7325359590969 array[2] = 76.8022689394663 array[3] = 55.8161191436537 array[4] = 20.6033154021033 array[5] = 55.8884794618415 array[6] = 90.6027066011926 array[7] = 44.2177873310716 array[8] = 97.754975314138 array[9] = 27.370445768987 [unmanaged] count = 10 array[0] = 72.624327 array[1] = 81.732536 array[2] = 76.802269 array[3] = 55.816119 array[4] = 20.603315 array[5] = 55.888479 array[6] = 90.602707 array[7] = 44.217787 array[8] = 97.754975 array[9] = 27.370446

Consulte também

Referência

Usando a interoperabilidade de C++ (PInvoke implícita)