Como realizar marshaling de ponteiros inseridos usando interop C++
Os exemplos de código a seguir usam as políticas de #pragma de gerenciado, não gerenciado para implementar gerenciado e funções não gerenciada no mesmo arquivo, mas essas funções interoperam da mesma forma que se definido em arquivos separados. Os arquivos que contêm somente funções não gerenciado não precisam ser compilados com /clr (compilação do Common Language Runtime).
Exemplo
O exemplo a seguir demonstra como uma função não gerenciado que usa uma estrutura que contém ponteiros pode ser chamada de uma função gerenciada. A função gerenciada cria uma instância de estrutura e inicializa o ponteiro inserido com a nova palavra-chave (em vez da palavra-chave de ref new, gcnew (Extensões de Componentes C++) ). Isso porque aloca memória heap nativo, não há necessidade de manter a matriz para suprimir a coleta de lixo. No entanto, a memória deve ser explicitamente excluída para evitar o escapamento 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;
}