Condividi tramite


Procedura: Effettuare il marshalling di stringhe Unicode utilizzando l'interoperabilità C++

Questo argomento illustra un facet dell'interoperabilità di Visual C++. Per altre informazioni, vedere Uso dell'interoperabilità C++ (PInvoke implicito).For more information, see Using C++ Interop (Implicit PInvoke).

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. I file contenenti solo funzioni non gestite non devono essere compilati con /clr (compilazione Common Language Runtime).

In questo argomento viene illustrato come le stringhe Unicode possono essere passate da una funzione gestita a una funzione non gestita e viceversa. Per l'interoperabilità con altri tipi di stringhe, vedere gli argomenti seguenti:

Esempio: Passare una stringa Unicode da gestita a una funzione non gestita

Per passare una stringa Unicode da un oggetto gestito a una funzione non gestita, è possibile usare la funzione PtrToStringChars (dichiarata in Vcclr.h) per accedere alla memoria in cui è archiviata la stringa gestita. Poiché questo indirizzo verrà passato a una funzione nativa, è importante che la memoria venga aggiunta con pin_ptr (C++/CLI) per impedire che i dati stringa vengano spostati, in caso di esecuzione di un ciclo di Garbage Collection durante l'esecuzione della funzione non gestita.

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

using namespace std;

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

#pragma unmanaged

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

#pragma managed

int main() {
   String^ s = gcnew String("test string");
   pin_ptr<const wchar_t> str = PtrToStringChars(s);

   Console::WriteLine("(managed) passing string to native func...");
   NativeTakesAString( str );
}

Esempio: Marshalling dei dati necessario per accedere alla stringa Unicode

Nell'esempio seguente viene illustrato il marshalling dei dati necessario per accedere a una stringa Unicode in una funzione gestita chiamata da una funzione non gestita. La funzione gestita, nella ricezione della stringa Unicode nativa, la converte in una stringa gestita usando il PtrToStringUni metodo .

// MarshalUnicode2.cpp
// compile with: /clr
#include <iostream>

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

#pragma managed

void ManagedStringFunc(wchar_t* s) {
   String^ ms = Marshal::PtrToStringUni((IntPtr)s);
   Console::WriteLine("(managed) received '{0}'", ms);
}

#pragma unmanaged

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

#pragma managed

int main() {
   NativeProvidesAString();
}

Vedi anche

Uso delle funzionalità di interoperabilità C++ (PInvoke implicito)