更新:2007 年 11 月
若要使用自定义封送拆收器,必须将 MarshalAsAttribute 属性应用于正在封送处理的参数或字段。此属性可标识激活相应包装的自定义封送拆收器。
自定义封送拆收器将通过实现 ICustomMarshaler 接口来为运行库提供相应的包装,并且在第一次需要封送参数时创建自定义的封送拆收器。它将对自定义封送拆收器调用 MarshalNativeToManaged 和 MarshalManagedToNative 方法,以激活正确的包装来处理调用。下表说明了 ICustomMarshaler 接口所公开的每种方法。
| 接口方法 | 说明 | 
|---|---|
| MarshalNativeToManaged | 返回可以封送作为参数传递的非托管接口的自定义运行库可调用包装。封送拆收器应该为该类型返回自定义运行库可调用包装的一个实例。 | 
| MarshalManagedToNative | 返回可以封送作为参数传递的托管接口的自定义 COM 可调用包装。封送拆收器应该为该类型返回自定义 COM 可调用包装的一个实例。 | 
| CleanUpNativeData | 使自定义封送拆收器有机会对 MarshalManagedToNative 方法返回的包装执行任何必要的清理。 | 
| CleanUpManagedData | 使自定义封送拆收器有机会对 MarshalNativeToManaged 方法返回的包装执行任何必要的清理。 | 
| GetInstance | 检索自定义封送拆收器的一个实例。此静态方法每次可以创建自定义封送拆收器的一个新实例;或者,如果自定义封送拆收器无状态,它可以始终使用同一个实例。每当参数或字段标记了 UnmanagedType.CustomMarshaler 时,此方法都将由封送处理服务调用来创建封送拆收器。 |