次の方法で共有


GCHandle 構造体

アンマネージ メモリからマネージ オブジェクトにアクセスできるようにします。

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

System.Object
   System.ValueType
      System.Runtime.InteropServices.GCHandle

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

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

スレッドセーフ

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

解説

ガベージ コレクタ ハンドル (または GCHandle 値型) は、 GCHandleType 列挙体と組み合わせて、任意のマネージ オブジェクトに対応するハンドルを作成するために使用します。このハンドルの種類は、 WeakWeakTrackResurrectionNormal 、または Pinned のいずれかになります。いったん割り当てられた後は、 GCHandle を使用することによって、アンマネージ クライアントが唯一の参照を保持しているときに、マネージ オブジェクトがガベージ コレクタによって収集されることを防ぐことができます。このようなハンドルがないと、オブジェクトが、アンマネージ クライアントの代わりとなって実行する処理を完了する前に、ガベージ コレクタによって収集される可能性があります。

また、 GCHandle を使用して、メモリ アドレスを返す固定オブジェクトを作成し、ガベージ コレクタがオブジェクトをメモリから取り除くことを防ぐこともできます。マネージ コードからは、新しいオブジェクト参照を取得できます。 IsAllocated を除くすべてのプロパティについて、関連付けられている SecurityPermissionFlag.UnmanagedCode 列挙値と一緒に SecurityPermission を使用することによって、アンマネージ コードのアクセス許可を適用する必要があります。

使用例

[Visual Basic, C#] GCHandle.Alloc メソッドを使用してマネージ オブジェクトへのハンドルを作成する App クラスの例を次に示します。これによって、マネージ オブジェクトはガベージ コレクションの対象から除外されます。 EnumWindows メソッドの呼び出しは、デリゲートとマネージ オブジェクト (両方ともマネージ型として宣言されていますが、ここでは示されていません) を渡し、ハンドルを IntPtr にキャストします。このアンマネージ関数は、コールバック関数のパラメータとして型を呼び出し元に戻します。

 
Public Class App
   Public Shared Sub Main()
      Dim tw As TextWriter = System.Console.Out
      Dim gch As GCHandle = GCHandle.Alloc( tw )
      
      ' Platform invoke prevents the delegate from being garbage collected
      ' before the call ends.
      Dim cewp As CallBack
      cewp = AddressOf App.CaptureEnumWindowsProc
      LibWrap.EnumWindows( cewp, GCHandle.op_Explicit( gch ))
      gch.Free()
   End Sub 'Main
   
   Public Shared Function CaptureEnumWindowsProc( ByVal handle _
         As Integer, ByVal param As IntPtr ) As Boolean
      Dim gch As GCHandle = GCHandle.op_Explicit( param )
      Dim tw As TextWriter = CType( gch.Target, TextWriter )
      tw.WriteLine( handle )
      return True
   End Function 'CaptureEnumWindowsProc
End Class 'App
[C#] 
public class App
{
   public static void Main()
   {
      TextWriter tw = System.Console.Out;
      GCHandle gch = GCHandle.Alloc( tw );
      CallBack cewp = new CallBack( CaptureEnumWindowsProc );
      
      // Platform invoke prevents the delegate from being garbage 
      // collected before the call ends.
      LibWrap.EnumWindows( cewp, (IntPtr)gch );
      gch.Free();
   }
   
   private static bool CaptureEnumWindowsProc( int handle, IntPtr param )
   {
      GCHandle gch = (GCHandle)param;
      TextWriter tw = (TextWriter)gch.Target;
      tw.WriteLine( handle );
      return true;
   }   
}

[C++, JScript] C++ および JScript のサンプルはありません。Visual Basic および 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 ファミリ, .NET Compact Framework - Windows CE .NET

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

参照

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