Přehled zařazování v C++/CLI
V smíšeném režimu je někdy nutné zařaďte data mezi nativními a spravovanými typy. Knihovna zařazování pomáhá zařazovat a převádět data jednoduchým způsobem. Knihovna zařazování se skládá ze sady funkcí a marshal_context
třídy, která provádí zařazování pro běžné typy. Knihovna je definována v těchto hlavičkách v adresáři include/msclr pro vaši edici sady Visual Studio:
Hlavička | Popis |
---|---|
marshal.h | marshal_context zařazování funkcí bez kontextu |
marshal_atl.h | Funkce pro zařazování typů ATL |
marshal_cppstd.h | Funkce pro zařazování standardních typů C++ |
marshal_windows.h | Funkce pro zařazování typů Windows |
Výchozí cesta ke složce msclr je něco takového v závislosti na tom, jakou edici máte, a číslo buildu:
C:\\Program Files (x86)\\Microsoft Visual Studio\\Preview\\Enterprise\\VC\\Tools\\MSVC\\14.15.26528\\include\\msclr
Knihovnu zařazování můžete použít s marshal_context třídou nebo bez. Některé převody vyžadují kontext. Jiné převody je možné implementovat pomocí funkce marshal_as . Následující tabulka uvádí podporované aktuální převody, jestli vyžadují kontext a jaký zařazovací soubor musíte zahrnout:
Z typu | Psaní | Zařazování metody | Zahrnout soubor |
---|---|---|---|
System::String^ | const char * | marshal_context | marshal.h |
const char * | System::String^ | marshal_as | marshal.h |
uklízečka* | 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 | KLIKA | marshal_as | marshal_windows.h |
KLIKA | 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^ | Znak CStringT<> | marshal_as | marshal_atl.h |
Znak 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 |
Zařazování vyžaduje kontext pouze v případě, že zařazujete ze spravovaného do nativních datových typů a nativní typ, na který převádíte, nemá destruktor pro automatické vyčištění. Kontext zařazování zničí přidělený nativní datový typ v jeho destruktoru. Převody, které vyžadují kontext, budou platné pouze do doby, než se kontext odstraní. Pokud chcete uložit všechny zařazované hodnoty, musíte hodnoty zkopírovat do vlastních proměnných.
Poznámka:
Pokud máte v řetězci vložené NULL
znaky, výsledek zařazování řetězce není zaručený. Vložené NULL
znaky můžou způsobit zkrácení řetězce nebo jejich zachování.
Tento příklad ukazuje, jak zahrnout adresář msclr do deklarace hlavičky include:
#include "msclr\marshal_cppstd.h"
Knihovna zařazování je rozšiřitelná, takže můžete přidat vlastní typy zařazování. Další informace o rozšíření knihovny zařazování naleznete v tématu Postupy: Rozšíření zařazování knihovny.