代替マーシャラーの使用
マーシャラーを作成した後で、それを特定の型のためのカスタム ラッパーとして使用できます。 マネージ インターフェイス定義 IUserData の例を次に示します。
Public Interface IUserData
Sub DoSomeStuff(pINew As INew)
End Interface
public interface IUserData {
void DoSomeStuff(INew pINew);
}
次の例では、IUserData インターフェイスが NewOldMarshaler を使用して、アンマネージ クライアントが DoSomeStuff メソッドに IOld インターフェイスを渡すことができるようにしています。 前の例で示したように、DoSomeStuff メソッドのマネージ記述は INew インターフェイスを取得しますが、一方、DoSomeStuff のアンマネージ バージョンは、次の例で示すように IOld インターフェイス ポインターを取得します。
タイプ ライブラリ表現
[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library UserLib {
[uuid(9B2BABCD-0705-11D3-A0CD-00C04FA35826)]
interface IUserData : IUnknown
HRESULT DoSomeStuff(IUnknown* pIOld);
}
IUserData のマネージ定義をエクスポートして生成したタイプ ライブラリは、標準の定義ではなく、この例で示すアンマネージ定義を生成します。 DoSomeStuff メソッドのマネージ定義の INew 引数に適用された MarshalAsAttribute 属性は、次の例に示すように、カスタム マーシャラーを使用するように INew 引数に指示します。
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 を使用してカスタム マーシャラーを指定すると、MarshalAsAttribute は次の 2 つの名前付きパラメーターを取得します。
MarshalType (必須)
カスタム マーシャラーのアセンブリ限定名。 名前には、カスタム マーシャラーの名前空間とクラスが含まれています。 カスタム マーシャラーが、使用するアセンブリとは別のアセンブリ内で定義されている場合は、カスタム マーシャラーが定義されているアセンブリの名前を指定してください。
注意
MarshalType フィールドの代わりに、MarshalTypeRef フィールドを使用できます。MarshalTypeRef は、簡単に指定できる方の型を使用します。
MarshalCookie (省略可能)
カスタム マーシャラーに渡されるクッキー。 クッキーを使用することにより、マーシャラーに追加の情報を提供できます。 たとえば、同じマーシャラーを使用して複数のラッパーを提供し、クッキーで特定のラッパーを指定します。 クッキーはマーシャラーの GetInstance メソッドに渡されます。