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 NULL
s dalam string Anda, hasil marshaling string tidak dijamin. S yang disematkan NULL
dapat 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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk