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

In questo argomento viene illustrato un facet di interoperabilità Visual C++. Per ulteriori informazioni, vedere Utilizzo delle funzionalità di interoperabilità C++ (PInvoke implicito).

Negli esempi di codice riportati di seguito vengono utilizzate le direttive #pragma managed, unmanaged per implementare funzioni gestite e non gestite nello stesso file. Queste funzioni, tuttavia, vengono eseguite nello stesso modo anche se definite in file diversi. I file che contengono soltanto funzioni non gestite non richiedono necessariamente la compilazione con /clr (Common Language Runtime Compilation).

In questo argomento viene illustrato come passare stringhe Unicode da una funzione gestita a una funzione non gestita e viceversa. Per informazioni sull'interoperabilità con altri tipi string, vedere i seguenti argomenti:

Esempio

Per passare una stringa Unicode da una funzione gestita a una funzione non gestita, è possibile utilizzare la funzione PtrToStringChars (dichiarata in Vcclr.h) per accedere all'area di memoria in cui è contenuta la stringa gestita. Poiché questo indirizzo verrà passato a una funzione nativa, è importante che la memoria venga bloccata con pin_ptr per impedire la rilocazione dei dati della stringa nel caso in cui venisse eseguito 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 );
}

Nell'esempio di codice riportato di seguito viene illustrato il marshalling dei dati necessario per l'accesso a una stringa Unicode in una funzione gestita chiamata da una funzione non gestita. La funzione gestita, al momento della ricezione della stringa Unicode nativa, la converte in una stringa gestita utilizzando il metodo PtrToStringUni.

// 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();
}

Vedere anche

Riferimenti

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