C++/CLI 中的封送处理概述
在混合模式下,有时必须在本机类型和托管类型之间封送数据。 封送库可帮助你以简单方式封送和转换数据。 封送库由一组函数和一个 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 函数实现。 下表列出了当前支持的转换、它们是否需要上下文以及必须包含的封送文件:
转换前类型 | 转换后类型 | 封送方法 | include 文件 |
---|---|---|---|
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<char> | marshal_as | marshal_atl.h |
CStringT<char> | 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 |
仅当从托管数据类型封送到本机数据类型并且要转换到的本机类型没有用于自动清理的析构函数时,封送处理才需要上下文。 封送处理上下文会销毁在析构函数中分配的本机数据类型。 因此,仅当删除上下文时,需要上下文的转换才有效。 若要保存任何封送值,必须将值复制到你自己的变量中。
注意
如果已在字符串中嵌入 NULL
,则无法保证该字符串的封送结果。 嵌入的 NULL
可能会导致字符串被截断,也可能被保留下来。
此示例演示如何在 include 标头声明中包括 msclr 目录:
#include "msclr\marshal_cppstd.h"
封送库可扩展,因此可向其添加你自己的封送类型。 有关扩展封送库的详细信息,请参阅操作说明:扩展封送库。