C++/CLI 中的封送處理概觀

在混合模式中,您有時必須在原生和 Managed 類型之間封送處理您的資料。 封 送處理程式庫 可協助您以簡單的方式封送處理和轉換資料。 封送處理程式庫是由一組函式和一個 marshal_context 類別所組成,這些函式會針對一般類型執行封送處理。 程式庫定義于 Visual Studio 版本的 include/msclr 目錄中的這些標頭 中:

標頭 描述
marshal.h marshal_context 類別和無內容封送處理函式
marshal_atl.h 封送處理 ATL 類型的函式
marshal_cppstd.h 封送處理標準 C++ 類型的函式
marshal_windows.h 封送處理 Windows 類型的函式

msclr 資料夾的預設路徑 會根據您擁有的版本和組建編號,如下所示:

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

您可以使用封送處理程式庫搭配或不使用 marshal_coNtext 類別 。 某些轉換需要內容。 您可以使用 marshal_as 函式來實 作其他轉換。 下表列出目前支援的轉換、是否需要內容,以及您必須包含哪些封送處理檔案:

從類型 輸入 封送處理方法 包含檔案
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 < 字元> marshal_as marshal_atl.h
CStringT < 字元> 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

只有在您從 Managed 封送處理到原生資料類型,而且要轉換成的原生類型沒有自動清除的解構函式時,封送處理才需要內容。 封送處理內容會終結其解構函式中配置的原生資料類型。 因此,只有在刪除內容之前,需要內容的轉換才會有效。 若要儲存任何封送處理的值,您必須將值複製到您自己的變數。

注意

如果您已將 內嵌 NULL 在字串中,則不保證封送處理字串的結果。 內嵌 NULL 的 可能會導致字串遭到截斷,或可能會加以保留。

此範例示範如何在 include 標頭宣告中包含 msclr 目錄:

#include "msclr\marshal_cppstd.h"

封送處理程式庫是可延伸的,因此您可以新增自己的封送處理類型。 如需擴充封送處理程式庫的詳細資訊,請參閱 如何:擴充封送處理程式庫

另請參閱

C++ 支援程式庫
如何:擴充封送處理程式庫