Procedura: Effettuare il marshalling di stringhe ANSI utilizzando l'interoperabilità C++
Questo argomento illustra come le stringhe ANSI possono essere passate usando l'interoperabilità C++, ma .NET Framework String rappresenta stringhe in formato Unicode, quindi la conversione in ANSI è un passaggio aggiuntivo. Per l'interoperabilità con altri tipi di stringa, vedere gli argomenti seguenti:
Procedura: Effettuare il marshalling di stringhe Unicode tramite l'interoperabilità C++
Procedura: Effettuare il marshalling di stringhe COM tramite l'interoperabilità C++
Gli esempi di codice seguenti usano le direttive #pragma gestite e non gestite per implementare funzioni gestite e non gestite nello stesso file, ma queste funzioni interagiscono nello stesso modo se definite in file separati. Poiché i file contenenti solo funzioni non gestite non devono essere compilati con /clr (compilazione Common Language Runtime), possono mantenere le relative caratteristiche di prestazioni.
Esempio: Passare una stringa ANSI
Nell'esempio viene illustrato il passaggio di una stringa ANSI da una funzione gestita a una funzione non gestita tramite StringToHGlobalAnsi. Questo metodo alloca memoria nell'heap non gestito e restituisce l'indirizzo dopo l'esecuzione della conversione. Ciò significa che non è necessaria alcuna aggiunta (perché la memoria nell'heap GC non viene passata alla funzione non gestita) e che l'oggetto IntPtr restituito da StringToHGlobalAnsi deve essere rilasciato in modo esplicito o i risultati di una perdita di memoria.
// 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 );
}
Esempio: Marshalling dei dati necessario per accedere alla stringa ANSI
Nell'esempio seguente viene illustrato il marshalling dei dati necessario per accedere a una stringa ANSI in una funzione gestita chiamata da una funzione non gestita. La funzione gestita, nella ricezione della stringa nativa, può usarla direttamente o convertirla in una stringa gestita usando il PtrToStringAnsi metodo , come illustrato.
// 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();
}
Vedi anche
Uso delle funzionalità di interoperabilità C++ (PInvoke implicito)