共用方式為


實作 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.MarshalNativeToManagedICustomMarshaler.MarshalManagedToNative 方法,以啟動正確的包裝函式來處理呼叫。 下表描述 ICustomMarshaler 介面公開的方法。

方法

描述

MarshalNativeToManaged

將原生資料的指標封送處理為 Managed 物件。 這個方法會傳回自訂執行階段可呼叫包裝函式 (RCW),它可以封送處理做為引數傳遞的 Unmanaged 介面。 封送處理器應該傳回該型別之自訂 RCW 的執行個體。

MarshalManagedToNative

將 Managed 物件封送處理為原生資料的指標。 這個方法會傳回自訂 COM 可呼叫包裝函式 (CCW),它可以封送處理做為引數傳遞的 Managed 介面。 封送處理器應該傳回該型別之自訂 CCW 的執行個體。

CleanUpNativeData

可以讓封送處理器清除 MarshalManagedToNative 方法所傳回的原生資料。

CleanUpManagedData

可以讓封送處理器清除 MarshalNativeToManaged 方法所傳回的 Managed 資料。

GetNativeDataSize

傳回要封送處理之 Unmanaged 資料的大小。

請參閱

概念

定義封送處理類型

使用替代封送處理器

其他資源

自訂封送處理