在混合模式中,您有時必須在原生和 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"
封送處理連結庫是可延伸的,因此您可以新增自己的封送處理類型。 如需擴充封送處理連結庫的詳細資訊,請參閱 如何:擴充封送處理連結庫。