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 インターフェイスにより公開されるメソッドを次の表に示します。
メソッド |
説明 |
---|---|
ネイティブ データへのポインターをマネージ オブジェクトにマーシャリングします。 このメソッドは、引数として渡されたアンマネージ インターフェイスをマーシャリングできるカスタム ランタイム呼び出し可能ラッパー (RCW: Runtime Callable Wrapper) を返します。 マーシャラーは、その型に対応するカスタム RCW のインスタンスを返します。 |
|
マネージ オブジェクトをネイティブ データへのポインターにマーシャリングします。 このメソッドは、引数として渡されたマネージ インターフェイスをマーシャリングできるカスタム COM 呼び出し可能ラッパー (CCW: COM Callable Wrapper) を返します。 マーシャラーは、その型に対応するカスタム CCW のインスタンスを返します。 |
|
マーシャラーが MarshalManagedToNative メソッドから返されたネイティブ データをクリーンアップできるようにします。 |
|
マーシャラーが MarshalNativeToManaged メソッドから返されたマネージ データをクリーンアップできるようにします。 |
|
マーシャリングするアンマネージ データのサイズを返します。 |