HandleRef 構造体


プラットフォーム呼び出しを使用してアンマネージド コードに渡されるリソースへのハンドルを保持しているマネージド オブジェクトをラップします。Wraps a managed object holding a handle to a resource that is passed to unmanaged code using platform invoke.

public value class HandleRef
public struct HandleRef
type HandleRef = struct
Public Structure HandleRef



.NET Framework 2.0 以降では、クラスのHandleRef機能はクラスとその派生クラス、およびCriticalHandleクラスにSafeHandleよって置き換えられています。Starting with the .NET Framework 2.0, the functionality of the HandleRef class has been replaced by the SafeHandle class and its derived classes, as well as by the CriticalHandle class.

プラットフォーム呼び出しを使用してマネージオブジェクトを呼び出す場合に、そのオブジェクトが、プラットフォーム呼び出しの後どこかで参照されていないと、ガベージコレクターがマネージオブジェクトを終了する可能性があります。If you use platform invoke to call a managed object, and the object is not referenced elsewhere after the platform invoke call, it is possible for the garbage collector to finalize the managed object. この操作は、リソースを解放し、ハンドルを無効にして、プラットフォーム呼び出しが失敗する原因となります。This action releases the resource and invalidates the handle, causing the platform invoke call to fail. でハンドルをラップHandleRefすると、プラットフォーム呼び出しの呼び出しが完了するまで、マネージオブジェクトはガベージコレクションされません。Wrapping a handle with HandleRef guarantees that the managed object is not garbage collected until the platform invoke call completes. プラットフォーム呼び出しサービスの詳細については、「アンマネージ DLL 関数の使用」を参照してください。For a description of platform invoke services, see Consuming Unmanaged DLL Functions.

値型は、のGCHandleように、相互運用マーシャラーによって認識される特殊な型です。 HandleRefThe HandleRef value type, like GCHandle, is a special type recognized by the interop marshaler. また、通常は固定GCHandle HandleRefされていないので、遅延のないガベージコレクションを防ぐことができ、パフォーマンスが向上します。A normal, nonpinned GCHandle also prevents untimely garbage collection, yet HandleRef provides better performance. を使用HandleRefして、プラットフォーム呼び出しの存続期間中にオブジェクトを維持したままにすることをおGC.KeepAlive勧めしますが、同じ目的でメソッドを使用することもできます。Although using HandleRef to keep an object alive for the duration of a platform invoke call is preferred, you can also use the GC.KeepAlive method for the same purpose.

コンストラクター HandleRefは、ラッパーをObject表すという2つのパラメーターとIntPtr 、アンマネージハンドルを表すを受け取ります。The HandleRef constructor takes two parameters: an Object representing the wrapper, and an IntPtr representing the unmanaged handle. 相互運用マーシャラーは、アンマネージコードへのハンドルのみを渡し、呼び出しの間、(のHandleRefコンストラクターに最初のパラメーターとして渡される) ラッパーが有効なままであることを保証します。The interop marshaler passes only the handle to unmanaged code, and guarantees that the wrapper (passed as the first parameter to the constructor of the HandleRef) remains alive for the duration of the call.


HandleRef(Object, IntPtr)

ラップするオブジェクトと、アンマネージ コードで使用するリソースへのハンドルを指定して、HandleRef クラスの新しいインスタンスを初期化します。Initializes a new instance of the HandleRef class with the object to wrap and a handle to the resource used by unmanaged code.



リソースへのハンドルを取得します。Gets the handle to a resource.


リソースへのハンドルを保持しているオブジェクトを取得します。Gets the object holding the handle to a resource.



HandleRef オブジェクトの内部整数表現を返します。Returns the internal integer representation of a HandleRef object.


Explicit(HandleRef to IntPtr)

指定した HandleRef オブジェクトのリソースへのハンドルを返します。Returns the handle to a resource of the specified HandleRef object.