次の方法で共有


HandleRef 構造体

プラットフォームの呼び出しを使用して、アンマネージ コードに渡されるリソースへのハンドルを保持しているマネージ オブジェクトをラップします。

この型のすべてのメンバの一覧については、HandleRef メンバ を参照してください。

System.Object
   System.ValueType
      System.Runtime.InteropServices.HandleRef

Public Structure HandleRef
[C#]
public struct HandleRef
[C++]
public __value struct HandleRef

[JScript] JScript では、.NET Framework の構造体を利用することができます。ただし、独自に定義することはできません。

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

プラットフォーム呼び出しを使用してマネージ オブジェクトを呼び出し、このプラットフォーム呼び出しの後でオブジェクトが他で一切参照されていない場合、ガベージ コレクタがマネージ オブジェクトを終了する可能性があります。これによって、リソースが解放され、ハンドルが無効になり、プラットフォーム呼び出しは失敗します。 HandleRef でハンドルをラップすると、プラットフォーム呼び出しが終了するまで、マネージ オブジェクトはガベージ コレクションの対象になることはありません。プラットフォーム呼び出しサービスの説明については、「 アンマネージ DLL 関数の処理 」を参照してください。

GCHandle と同様、 HandleRef 値型は、相互運用マーシャラが認識できる特別な型です。通常の固定されていない GCHandle を使用しても、予期しないガベージ コレクションを防ぐことができますが、 HandleRef の動作の方が優れています。プラットフォーム呼び出しの有効期間の間オブジェクトを有効にしておくには HandleRef の使用を推奨しますが、同じ目的で GC.KeepAlive メソッドを使用することもできます。

HandleRef コンストラクタは、ラッパーを表す Object 、およびアンマネージ ハンドルを表す IntPtr の 2 つのパラメータを受け取ります。相互運用マーシャラは、ハンドルだけをアンマネージ コードに渡し、呼び出しの有効期間の間ラッパー (HandleRef のコンストラクタの 1 番目のパラメータとして渡される) が有効となるよう保証します。

使用例

[Visual Basic, C#, C++] HandleRef を使用して、1 番目のパラメータに渡されたオブジェクトを有効に保つ方法を次の例に示します。相互運用マーシャラは、ハンドルだけをアンマネージ コードに渡します。

 
Dim fs As New FileStream( "HandleRef.txt", FileMode.Open )
Dim hr As New HandleRef( fs, fs.Handle )
Dim buffer As New StringBuilder( 5 )
Dim read As Integer = 0

' platform invoke will hold reference to HandleRef until call ends

LibWrap.ReadFile( hr, buffer, 5, read, 0 )
Console.WriteLine( "Read with struct parameter: {0}", buffer )

[C#] 
FileStream fs = new FileStream( "HandleRef.txt", FileMode.Open );
HandleRef hr = new HandleRef( fs, fs.Handle );
StringBuilder buffer = new StringBuilder( 5 );
int read = 0;

// platform invoke will hold reference to HandleRef until call ends

LibWrap.ReadFile( hr, buffer, 5, out read, 0 );
Console.WriteLine( "Read with struct parameter: {0}", buffer );

[C++] 
FileStream* fs = new FileStream( S"HandleRef.txt", FileMode::Open );
HandleRef hr = HandleRef( fs, fs->Handle );
StringBuilder* buffer = new StringBuilder( 5 );
int read = 0;

// platform invoke will hold reference to HandleRef until call ends

LibWrap::ReadFile( hr, buffer, 5, &read, 0 );
Console::WriteLine( S"Read with struct parameter: {0}", buffer );

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Runtime.InteropServices

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

HandleRef メンバ | System.Runtime.InteropServices 名前空間 | GCHandle