Bagikan melalui


Gambaran Umum Marshaling di C++/CLI

Dalam mode campuran, Anda terkadang harus melakukan marshal data Anda antara jenis asli dan terkelola. Pustaka marshaling membantu Anda marshal dan mengonversi data dengan cara yang sederhana. Pustaka marshaling terdiri dari sekumpulan fungsi dan marshal_context kelas yang melakukan marshaling untuk jenis umum. Pustaka didefinisikan dalam header ini dalam direktori include/msclr untuk edisi Visual Studio Anda:

Header Deskripsi
marshal.h marshal_context fungsi marshaling kelas dan bebas konteks
marshal_atl.h Fungsi untuk marshaling jenis ATL
marshal_cppstd.h Fungsi untuk marshaling jenis C++ standar
marshal_windows.h Fungsi untuk marshaling jenis Windows

Jalur default untuk folder msclr adalah sesuatu seperti ini tergantung pada edisi mana yang Anda miliki dan nomor build:

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

Anda dapat menggunakan pustaka marshaling dengan atau tanpa Kelas marshal_context. Beberapa konversi memerlukan konteks. Konversi lain dapat diimplementasikan menggunakan fungsi marshal_as . Tabel berikut mencantumkan konversi saat ini yang didukung, apakah mereka memerlukan konteks, dan file marshal apa yang harus Anda sertakan:

Dari jenis Untuk mengetik Metode Marshal Menyertakan file
System::String^ karakter const * marshal_context marshal.h
karakter const * 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
Sistem::IntPtr MENANGANI marshal_as marshal_windows.h
MENANGANI Sistem::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^ Karakter CStringT<> marshal_as marshal_atl.h
Karakter CStringT<> System::String^ marshal_as marshal_atl.h
System::String^ wchar_t CStringT<> marshal_as marshal_atl.h
wchar_t CStringT<> System::String^ marshal_as marshal_atl.h
System::String^ CComBSTR marshal_as marshal_atl.h
CComBSTR System::String^ marshal_as marshal_atl.h

Marshaling memerlukan konteks hanya ketika Anda marshal dari dikelola ke jenis data asli dan jenis asli yang Anda konversi tidak memiliki destruktor untuk pembersihan otomatis. Konteks marshaling menghancurkan jenis data asli yang dialokasikan di destruktornya. Oleh karena itu, konversi yang memerlukan konteks hanya akan valid hingga konteks dihapus. Untuk menyimpan nilai marshal apa pun, Anda harus menyalin nilai ke variabel Anda sendiri.

Catatan

Jika Anda telah menyematkan NULLs dalam string Anda, hasil marshaling string tidak dijamin. S yang disematkan NULLdapat menyebabkan string terpotong atau mungkin dipertahankan.

Contoh ini menunjukkan cara menyertakan direktori msclr dalam deklarasi header include:

#include "msclr\marshal_cppstd.h"

Pustaka marshaling dapat diperluas sehingga Anda dapat menambahkan jenis marshaling Anda sendiri. Untuk informasi selengkapnya tentang memperluas pustaka marshaling, lihat Cara: Memperluas Pustaka Marsekal.

Baca juga

Pustaka Dukungan C++
Cara: Memperluas Pustaka Marshaling