使用替代封送處理器
一旦封送處理器完成之後,就可以用來做為特定型別的自訂包裝函式。 以下範例所示為 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 方法。