在混合模式中,您有时会需要封送在本机和托管类型之间的数据。 Visual Studio 2008 引入一种简单的封送处理库方法来封送处理库,帮助您封送和转换数据。
可以使用封送处理库用或不用 marshal_context 类。 这些转换需要上下文。 其他变换的实现,可以使用 函数marshal_as 。 下表列出了支持的当前转换,它们是否需要上下文,以及送文件必须包括:
从类型 |
到<目标类型> |
封送方法 |
包含文件<include>1 |
---|---|---|---|
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 |
系统::IntPtr。 |
HANDLE |
marshal_as |
marshal_windows.h |
HANDLE |
系统::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^ |
CStringTchar<> |
marshal_as |
marshal_atl.h |
CStringTchar<> |
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 |
只有当您从托管代码封送到本机数据类型时和转换的本机类型没有自动的析构函数清理时才需要上下文。 封送处理上下文会销毁在析构函数中分配的本机数据类型。 因此,转换需要的上下文将是有效的,直至上下文被删除。 若要保存任何封送的值,必须将值复制到您的变量。
备注
如果将 NULLs 封送到字符串中,则该字符串的结果得不到保证。嵌入 NULLs 可能会导致该字符串被截断或保留。
封送处理库标头文件位于 msclr 子目录的 include 目录中。 此示例展示了如何引用在标头声明 msclr 内容:
#include "msclr\marshal_cppstd.h"
封送处理库是可扩展的,因此您可以自己添加封送的类型。 有关扩展封送库的详细信息,请参见 如何:扩展封送处理库。
在早期版本中,封送数据可以使用 平台调用。 有关 PInvoke的更多信息,请参见从托管代码调用本机函数。