實作 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 介面公開的方法。
方法 |
描述 |
---|---|
將原生資料的指標封送處理為 Managed 物件。 這個方法會傳回自訂執行階段可呼叫包裝函式 (RCW),它可以封送處理做為引數傳遞的 Unmanaged 介面。 封送處理器應該傳回該型別之自訂 RCW 的執行個體。 |
|
將 Managed 物件封送處理為原生資料的指標。 這個方法會傳回自訂 COM 可呼叫包裝函式 (CCW),它可以封送處理做為引數傳遞的 Managed 介面。 封送處理器應該傳回該型別之自訂 CCW 的執行個體。 |
|
可以讓封送處理器清除 MarshalManagedToNative 方法所傳回的原生資料。 |
|
可以讓封送處理器清除 MarshalNativeToManaged 方法所傳回的 Managed 資料。 |
|
傳回要封送處理之 Unmanaged 資料的大小。 |