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"
封送處理連結庫是可延伸的,因此您可以新增自己的封送處理類型。 如需擴充封送處理連結庫的詳細資訊,請參閱 如何:擴充封送處理連結庫。