marshal_context 类

此类将在本机和托管环境之间转换数据。

语法

class marshal_context

备注

对于需要上下文的数据转换,请使用 marshal_context 类。 有关需要上下文的转换和必须包含的封送处理文件的详细信息,请参阅 C++ 中的封送处理概述。 使用上下文时的封送处理结果直到销毁 marshal_context 对象才有效。 若要保留结果,您必须复制数据。

同一个 marshal_context 可用于多个数据转换。 通过这种方式重用上下文将不影响之前封送处理调用的结果。

成员

公共构造函数

名称 描述
marshal_context::marshal_context 构造一个 marshal_context 对象,用于托管数据类型和本机数据类型之间的数据转换。
marshal_context::~marshal_context 销毁 marshal_context 对象。

公共方法

名称 描述
marshal_context::marshal_as 对特定数据对象执行封送处理,以在托管和本机数据类型之间转换它。

要求

头文件:<msclr\marshal.h>、<msclr\marshal_windows.h>、<msclr\marshal_cppstd.h> 或 <msclr\marshal_atl.h>

命名空间: msclr::interop

marshal_context::marshal_context

构造一个 marshal_context 对象,用于托管数据类型和本机数据类型之间的数据转换。

marshal_context();

备注

某些数据转换需要封送上下文。 有关需要上下文的转换和应用程序中必须包含的封送处理文件的详细信息,请参阅 C++ 中的封送处理概述

示例

请参阅 marshal_context::marshal_as 的示例。

marshal_context::~marshal_context

销毁 marshal_context 对象。

~marshal_context();

备注

某些数据转换需要封送上下文。 有关需要上下文的转换和应用程序中必须包含的封送处理文件的详细信息,请参阅 C++ 中的封送处理概述

删除 marshal_context 对象将使由此上下文转换的数据失效。 如果要在销毁 marshal_context 对象之后保留数据,则必须手动将数据复制到将保持的变量中。

marshal_context::marshal_as

对特定数据对象执行封送处理,以在托管和本机数据类型之间转换它。

To_Type marshal_as<To_Type>(
   From_Type input
);

参数

input
[in] 要封送给 To_Type 变量的值。

返回值

To_Type 类型的变量,是 input 的转换值。

注解

此函数将对特定数据对象执行封送处理。 仅将此函数与 C++ 中的封送处理概述中的表指示的转换一起使用。

如果尝试封送一对不支持的数据类型,marshal_as 则会在编译时生成错误 C4996。 有关详细信息,请阅读此错误提供的消息。 可以针对多个已弃用的函数生成 C4996 错误。 生成此错误的两个条件将尝试封送不支持的数据类型对,并尝试对需要上下文的转换使用 marshal_as

封送库由多个头文件组成。 任何转换只需要一个文件,但如果需要进行其他转换,则可以包含其他文件。 Marshaling Overview in C++中的表指示每次转换应包含的封送处理文件。

示例

此示例将为从 System::Stringconst char * 变量类型的封送处理创建上下文。 转换数据在删除上下文的行之后是无效的。

// marshal_context_test.cpp
// compile with: /clr
#include <stdlib.h>
#include <string.h>
#include <msclr\marshal.h>

using namespace System;
using namespace msclr::interop;

int main() {
   marshal_context^ context = gcnew marshal_context();
   String^ message = gcnew String("Test String to Marshal");
   const char* result;
   result = context->marshal_as<const char*>( message );
   delete context;
   return 0;
}