实现 ICustomMarshaler 接口
若要使用自定义封送拆收器,必须将 MarshalAsAttribute 特性应用于正在封送处理的参数或字段。 此特性可标识激活相应包装的自定义封送拆收器。
下面的 C# 代码显示必须由所有自定义封送拆收器实现的基接口:
namespace System.Runtime.InteropServices
{
using System;
[System.Runtime.InteropServices.ComVisible(true)]
public interface ICustomMarshaler
{
Object MarshalNativeToManaged( IntPtr pNativeData );
IntPtr MarshalManagedToNative( Object ManagedObj );
void CleanUpNativeData( IntPtr pNativeData );
void CleanUpManagedData( Object ManagedObj );
int GetNativeDataSize();
}
}
自定义封送拆收器必须实现 ICustomMarshaler 接口,以便为运行时提供相应的包装。
此外,必须实现下面的静态方法,可以调用该方法来检索自定义封送拆收器的实例:
static ICustomMarshaler *GetInstance(String *pstrCookie);
运行时会在第一次需要封送参数时创建自定义封送拆收器。 运行时随后会对该自定义封送拆收器调用 ICustomMarshaler.MarshalNativeToManaged 和 ICustomMarshaler.MarshalManagedToNative 方法来激活正确的包装以处理调用。 下表介绍由 ICustomMarshaler 接口公开的方法。
方法 |
说明 |
---|---|
将指向本机数据的指针封送到托管对象中。 此方法返回可以封送作为参数传递的非托管接口的自定义运行时可调用包装 (RCW)。 封送拆收器应该为该类型返回自定义 RCW 的一个实例。 |
|
将托管对象封送到指向本机数据的指针中。 此方法返回可以封送作为参数传递的托管接口的自定义 COM 可调用包装 (CCW)。 封送拆收器应该为该类型返回自定义 CCW 的一个实例。 |
|
启用封送拆收器清理 MarshalManagedToNative 方法返回的本机数据。 |
|
启用封送拆收器清理 MarshalNativeToManaged 方法返回的托管数据。 |
|
返回要封送的非托管数据的大小。 |