Compartilhar via


Como: realizar realizar marshaling o ANSI strings usando interoperabilidade C++

Este tópico demonstra como seqüências de caracteres ANSI podem ser passada usando interoperabilidade de C++, mas o.NET estrutura String representa seqüências de caracteres no formato Unicode, portanto, a conversão em ANSI é uma etapa extra. Para interoperar com outros tipos de seqüência de caracteres, consulte os tópicos a seguir:

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. Porque os 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), eles podem manter suas características de desempenho.

Exemplo

O exemplo demonstra passando uma seqüência de caracteres ANSI de um gerenciado para uma função não gerenciada usando StringToHGlobalAnsi. Esse método aloca memória heap não gerenciada e retorna o endereço depois de executar a conversão.Isso significa que não é necessário nenhum fixação (porque a memória no heap GC não está sendo passada para a função não gerenciada) e que o IntPtr retornado de StringToHGlobalAnsi deve ser explicitamente liberado ou resultados de um perda de memória.

// MarshalANSI1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(const char* p) {
   printf_s("(native) received '%s'\n", p);
}

#pragma managed

int main() {
   String^ s = gcnew String("sample string");
   IntPtr ip = Marshal::StringToHGlobalAnsi(s);
   const char* str = static_cast<const char*>(ip.ToPointer());

   Console::WriteLine("(managed) passing string...");
   NativeTakesAString( str );

   Marshal::FreeHGlobal( ip );
}

O exemplo a seguir demonstra o marshaling de dados necessários para acessar uma seqüência de caracteres ANSI em um gerenciado função que é chamada por um un gerenciado função.O gerenciado funcionem, na receber a seqüência de caracteres nativa, pode usá-lo diretamente ou convertê-lo para um gerenciado string usando o PtrToStringAnsi método, conforme mostrado.

// MarshalANSI2.cpp
// compile with: /clr
#include <iostream>
#include <vcclr.h>

using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed

void ManagedStringFunc(char* s) {
   String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s));
   Console::WriteLine("(managed): received '{0}'", ms);
}

#pragma unmanaged

void NativeProvidesAString() {
   cout << "(native) calling managed func...\n";
   ManagedStringFunc("test string");
}

#pragma managed

int main() {
   NativeProvidesAString();
}

Consulte também

Referência

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