Share via


使用替代封送處理器

一旦封送處理器完成之後,就可以用來做為特定型別的自訂包裝函式。 以下範例所示為 Managed 介面定義 IUserData:

Public Interface IUserData
    Sub DoSomeStuff(pINew As INew)
End Interface
public interface IUserData {
    void DoSomeStuff(INew pINew);
}

在以下範例中,IUserData 介面使用了 NewOldMarshaler,讓 Unmanaged 用戶端能夠將 IOld 介面傳遞給 DoSomeStuff 方法。 DoSomeStuff 方法的 Managed 描述會接受 INew 介面 (如先前範例中所示),而 DoSomeStuff 的 Unmanaged 版本則會接受 IOld 介面指標 (如下一個範例中所示)。

型別程式庫表示

[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library UserLib {
     [uuid(9B2BABCD-0705-11D3-A0CD-00C04FA35826)]
     interface IUserData : IUnknown
         HRESULT DoSomeStuff(IUnknown* pIOld);
}

藉由匯出 IUserData 的 Managed 定義產生的型別程式庫,會產生這個範例中所示的 Unmanaged 定義,而非標準定義。 在 DoSomeStuff 方法的 Managed 定義中,套用至 INew 引數的 MarshalAsAttribute 屬性 (Attribute) 表示引數使用自訂封送處理器,如下列範例所示:

Imports System.Runtime.InteropServices

Public Interface IUserData
    Public Sub DoSomeStuff( _
        <MarshalAs(UnmanagedType.CustomMarshaler, _
        MarshalType := "MyCompany.NewOldMarshaler")> pINew As INew)
    End Sub
End Interface
using System.runtime.InteropServices;

public interface IUserData {
    void DoSomeStuff(
        [MarshalAs(UnmanagedType.CustomMarshaler,
             MarshalType="MyCompany.NewOldMarshaler")]
        INew pINew
    );
}

用來指定自訂封送處理器時,MarshalAsAttribute 會接受下列兩種命名引數:

  • MarshalType (必要項)

    自訂封送處理器的組件限定名稱。 這個名稱應該包括自訂封送處理器的命名空間和類別。 如果定義自訂封送處理器所在的組件與使用時所在的組件不同,您必須指定定義時的組件名稱。

    注意事項注意事項

    您可以使用 MarshalTypeRef 欄位取代 MarshalType 欄位。MarshalTypeRef 會使用它較容易指定的型別。

  • MarshalCookie (選擇性)

    傳遞給自訂封送處理器的 Cookie。 您可以使用 Cookie 將額外資訊提供給封送處理器。 例如,同一個封送處理器可以用來提供好幾個包裝函式,而 Cookie 則可識別特定的包裝函式。 這個 Cookie 是傳遞給封送處理器的 GetInstance 方法。

請參閱

概念

自訂封送處理

定義封送處理型別

實作 ICustomMarshaler 介面