HandleRef 構造体とは? わかりやすく解説

HandleRef 構造体

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

名前空間: System.Runtime.InteropServices
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

<ComVisibleAttribute(True)> _
Public Structure HandleRef
[ComVisibleAttribute(true)] 
public struct HandleRef
[ComVisibleAttribute(true)] 
public value class HandleRef
/** @attribute ComVisibleAttribute(true) */ 
public final class HandleRef extends ValueType
JScript では、構造体使用できますが、新規に宣言することはできません。
解説解説

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

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

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

使用例使用例

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

Dim fs As New FileStream("HandleRef.txt",
 FileMode.Open)
Dim hr As New HandleRef(fs,
 fs.SafeFileHandle.DangerousGetHandle())
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)
FileStream fs = new FileStream("HandleRef.txt", FileMode.Open);
HandleRef hr = new HandleRef(fs, fs.SafeFileHandle.DangerousGetHandle());
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);
FileStream^ fs = gcnew FileStream( "HandleRef.txt", FileMode::Open );
HandleRef hr = HandleRef(fs,fs->Handle);
StringBuilder^ buffer = gcnew StringBuilder( 5 );
int read = 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 );

スレッド セーフスレッド セーフ
この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバ場合は、スレッド セーフであるとは限りません。
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
HandleRef メンバ
System.Runtime.InteropServices 名前空間
GCHandle 構造体



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「HandleRef 構造体」の関連用語

HandleRef 構造体のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



HandleRef 構造体のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2024 Microsoft.All rights reserved.

©2024 GRAS Group, Inc.RSS