Panoramica del marshalling in C++/CLI

In modalità mista, a volte è necessario effettuare il marshalling dei dati tra tipi nativi e gestiti. La libreria di marshalling consente di effettuare il marshalling e convertire i dati in modo semplice. La libreria di marshalling è costituita da un set di funzioni e da una marshal_context classe che eseguono il marshalling per i tipi comuni. La libreria è definita in queste intestazioni nella directory include/msclr per l'edizione di Visual Studio:

Intestazione Descrizione
marshal.h marshal_context funzioni di marshalling senza contesto e di classe
marshal_atl.h Funzioni per il marshalling dei tipi ATL
marshal_cppstd.h Funzioni per il marshalling dei tipi C++ standard
marshal_windows.h Funzioni per il marshalling dei tipi di Windows

Il percorso predefinito per la cartella msclr è simile al seguente a seconda dell'edizione in uso e del numero di build:

C:\\Program Files (x86)\\Microsoft Visual Studio\\Preview\\Enterprise\\VC\\Tools\\MSVC\\14.15.26528\\include\\msclr

È possibile usare la libreria di marshalling con o senza una classe marshal_context. Alcune conversioni richiedono un contesto. È possibile implementare altre conversioni usando la funzione marshal_as . La tabella seguente elenca le conversioni correnti supportate, se richiedono un contesto e quale file di marshalling è necessario includere:

Da tipo Per digitare Metodo di marshalling Includi file
System::String^ const char* marshal_context marshal.h
const char* System::String^ marshal_as marshal.h
char * System::String^ marshal_as marshal.h
System::String^ const wchar_t* marshal_context marshal.h
const wchar_t* System::String^ marshal_as marshal.h
wchar_t * System::String^ marshal_as marshal.h
System::IntPtr HANDLE marshal_as marshal_windows.h
HANDLE System::IntPtr marshal_as marshal_windows.h
System::String^ BSTR marshal_context marshal_windows.h
BSTR System::String^ marshal_as marshal.h
System::String^ bstr_t marshal_as marshal_windows.h
bstr_t System::String^ marshal_as marshal_windows.h
System::String^ std::string marshal_as marshal_cppstd.h
std::string System::String^ marshal_as marshal_cppstd.h
System::String^ std::wstring marshal_as marshal_cppstd.h
std::wstring System::String^ marshal_as marshal_cppstd.h
System::String^ CStringT<char> marshal_as marshal_atl.h
CStringT<char> System::String^ marshal_as marshal_atl.h
System::String^ CStringT<wchar_t> marshal_as marshal_atl.h
CStringT<wchar_t> System::String^ marshal_as marshal_atl.h
System::String^ CComBSTR marshal_as marshal_atl.h
CComBSTR System::String^ marshal_as marshal_atl.h

Il marshalling richiede un contesto solo quando si esegue il marshalling da tipi di dati gestiti a nativi e il tipo nativo in in non dispone di un distruttore per la pulizia automatica. Il contesto di marshalling elimina definitivamente il tipo di dati nativo allocato nel distruttore. Pertanto, le conversioni che richiedono un contesto saranno valide solo fino all'eliminazione del contesto. Per salvare i valori di cui è stato sottoposto a marshalling, è necessario copiare i valori nelle proprie variabili.

Nota

Se la stringa è stata incorporata NULL, il risultato del marshalling della stringa non è garantito. L'oggetto incorporato NULLpuò causare il troncamento della stringa o la conservazione.

Questo esempio mostra come includere la directory msclr in una dichiarazione di intestazione di inclusione:

#include "msclr\marshal_cppstd.h"

La libreria di marshalling è estendibile in modo da poter aggiungere tipi di marshalling personalizzati. Per altre informazioni sull'estensione della libreria di marshalling, vedere Procedura: Estendere la libreria di marshalling.

Vedi anche

Libreria di supporto per C++
Procedura: Estendere la libreria del marshalling