代替マーシャラの使用
更新 : 2007 年 11 月
マーシャラを作成した後で、それを特定の型のためのカスタム ラッパーとして使用できます。マネージ インターフェイス定義 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 (省略可能)
カスタム マーシャラに渡される cookie。cookie を使用することにより、マーシャラに追加の情報を提供できます。たとえば、同じマーシャラを使用して複数のラッパーを提供し、cookie で特定のラッパーを指定します。cookie はマーシャラの GetInstance メソッドに渡されます。