Gerenciamento de memória com interop marshaler

Interop marshaler sempre tenta disponível memória alocada pelo código não gerenciado.Esse comportamento está em conformidade com regras de gerenciamento de memória COM, mas difere as regras que governam o C++ nativo.

Confusão pode surgir se você antecipar o comportamento de C++ nativo (não liberando memória) quando usando invocação de plataforma, que libera a memória para ponteiros automaticamente.Por exemplo, chamando o método não gerenciado seguinte de uma DLL do C++ não ocorra automaticamente disponível toda a memória.

Assinatura não gerenciada

BSTR MethodOne (BSTR b) {
     return b;
}

No entanto, se você definir o método sistema autônomo uma plataforma de invocar o protótipo, substitua cada BSTR tipo com um String tipo e a telefonar MethodOne, o Common linguagem tempo de execução tenta liberar b duas vezes. Você pode alterar o comportamento de marshaling usando IntPtr tipos em vez de Seqüência de caracteres tipos.

O tempo de execução sempre usa o CoTaskMem disponível método disponível memória.Se a memória que você está trabalhando com não foi alocada com o CoTaskMemAlloc método, você deve usar um IntPtr e liberar a memória manualmente usando o método apropriado.Da mesma forma, você pode evitar automático de memória liberando em situações em que memória nunca deve ser liberada sistema autônomo, por exemplo, sistema autônomo ao usar o GetCommandLine função do Kernel32.dll, que retorna um ponteiro para a memória do kernel.Para obter detalhes sobre liberação de memória manualmente, consulte o Buffers de amostra.

Consulte também

Conceitos

Atributos direcionais

Blittable e tipos Blittable não

Copiando e fixação

Outros recursos

Comportamento de marshaling padrão