GCHandle GCHandle GCHandle GCHandle Struct

定義

アンマネージド メモリからマネージド オブジェクトにアクセスする手段を提供します。Provides a way to access a managed object from unmanaged memory.

public value class GCHandle
[System.Runtime.InteropServices.ComVisible(true)]
public struct GCHandle
type GCHandle = struct
Public Structure GCHandle
継承
属性

次の例は、Appを使用してマネージ オブジェクトを識別するハンドルを作成するクラス、GCHandle.Allocメソッドで、管理対象のオブジェクトが収集されていることを防ぎます。The following example shows an App class that creates a handle to a managed object using the GCHandle.Alloc method, which prevents the managed object from being collected. 呼び出し、EnumWindowsメソッドはデリゲートと (管理対象の型として宣言されている両方が表示されません)、管理対象オブジェクトを渡しますへのハンドルにキャストし、IntPtrします。A call to the EnumWindows method passes a delegate and a managed object (both declared as managed types, but not shown), and casts the handle to an IntPtr. アンマネージ関数は、呼び出し元にコールバック関数のパラメーターとして型を渡します。The unmanaged function passes the type back to the caller as a parameter of the callback function.

using System;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security.Permissions;

public delegate bool CallBack(int handle, IntPtr param);

public class LibWrap
{
	// passing managed object as LPARAM
	// BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);

	[DllImport("user32.dll")]
	public static extern bool EnumWindows(CallBack cb, IntPtr param);
}

public class App
{
	public static void Main()
	{
		Run();
	}

        [SecurityPermission(SecurityAction.Demand, UnmanagedCode=true)]
	public static void Run()
        {
		TextWriter tw = System.Console.Out;
		GCHandle gch = GCHandle.Alloc(tw);

		CallBack cewp = new CallBack(CaptureEnumWindowsProc);

		// platform invoke will prevent delegate to be garbage collected
		// before call ends

		LibWrap.EnumWindows(cewp, GCHandle.ToIntPtr(gch));
		gch.Free();
        }

	private static bool CaptureEnumWindowsProc(int handle, IntPtr param)
	{
		GCHandle gch = GCHandle.FromIntPtr(param);
		TextWriter tw = (TextWriter)gch.Target;
		tw.WriteLine(handle);
		return true;
	}
}
Imports System
Imports System.IO
Imports System.Threading
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports System.Security.Permissions

Public Delegate Function CallBack(ByVal handle As Integer, ByVal param As IntPtr) As Boolean


Module LibWrap

    ' passing managed object as LPARAM
    ' BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);
    <DllImport("user32.dll")> _
    Function EnumWindows(ByVal cb As CallBack, ByVal param As IntPtr) As Boolean
    End Function
End Module 'LibWrap


Module App

    Sub Main()
	Run()

    End Sub

    <SecurityPermission(SecurityAction.Demand, UnmanagedCode:=true)> _
    Sub Run()

        Dim tw As TextWriter = System.Console.Out
        Dim gch As GCHandle = GCHandle.Alloc(tw)

        Dim cewp As CallBack
        cewp = AddressOf CaptureEnumWindowsProc

        ' platform invoke will prevent delegate to be garbage collected
        ' before call ends
        LibWrap.EnumWindows(cewp, GCHandle.ToIntPtr(gch))
        gch.Free()

    End Sub


    Function CaptureEnumWindowsProc(ByVal handle As Integer, ByVal param As IntPtr) As Boolean
        Dim gch As GCHandle = GCHandle.FromIntPtr(param)
        Dim tw As TextWriter = CType(gch.Target, TextWriter)
        tw.WriteLine(handle)
        Return True

    End Function
End Module

注釈

GCHandle構造体を併用、GCHandleType列挙体を任意のマネージ オブジェクトに対応するハンドルを作成します。The GCHandle structure is used with the GCHandleType enumeration to create a handle corresponding to any managed object. このハンドルは、次の 4 種類のいずれかを指定できます: WeakWeakTrackResurrectionNormal、またはPinnedします。This handle can be one of four types: Weak, WeakTrackResurrection, Normal, or Pinned. ハンドルが割り当てられるは、管理対象のオブジェクトがアンマネージ クライアントは、唯一の参照を保持しているときに、ガベージ コレクターによって収集されることを防ぐために使用できます。When the handle has been allocated, you can use it to prevent the managed object from being collected by the garbage collector when an unmanaged client holds the only reference. このようなハンドルは、なしをアンマネージ クライアントに代わって、作業を完了する前に、オブジェクト、ガベージ コレクターによって収集できます。Without such a handle, the object can be collected by the garbage collector before completing its work on behalf of the unmanaged client.

使用することもGCHandleをガベージ コレクターがメモリ内でオブジェクトを移動するを防ぐために、メモリ アドレスを返す固定オブジェクトを作成します。You can also use GCHandle to create a pinned object that returns a memory address to prevent the garbage collector from moving the object in memory.

ハンドルがスコープ外になる必要があります明示的に解放することを呼び出して、Freeメソッド。 それ以外の場合、メモリのリークが発生する可能性があります。When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. 固定ハンドルを解放して、関連付けられたオブジェクトが削除されますへの他の参照がない場合、ガベージ コレクションの対象になります。When you free a pinned handle, the associated object will be unpinned and will become eligible for garbage collection, if there are no other references to it.

プロパティ

IsAllocated IsAllocated IsAllocated IsAllocated

ハンドルが割り当てられているかどうかを示す値を取得します。Gets a value indicating whether the handle is allocated.

Target Target Target Target

ハンドルが表すオブジェクトを取得または設定します。Gets or sets the object this handle represents.

メソッド

AddrOfPinnedObject() AddrOfPinnedObject() AddrOfPinnedObject() AddrOfPinnedObject()

内のオブジェクトのアドレスを取得、Pinnedを処理します。Retrieves the address of an object in a Pinned handle.

Alloc(Object) Alloc(Object) Alloc(Object) Alloc(Object)

割り当て、Normal指定したオブジェクトを処理します。Allocates a Normal handle for the specified object.

Alloc(Object, GCHandleType) Alloc(Object, GCHandleType) Alloc(Object, GCHandleType) Alloc(Object, GCHandleType)

指定したオブジェクトに指定した型のハンドルを割り当てます。Allocates a handle of the specified type for the specified object.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

決定かどうか、指定したGCHandleオブジェクトが現在GCHandleオブジェクト。Determines whether the specified GCHandle object is equal to the current GCHandle object.

Free() Free() Free() Free()

リリースをGCHandleします。Releases a GCHandle.

FromIntPtr(IntPtr) FromIntPtr(IntPtr) FromIntPtr(IntPtr) FromIntPtr(IntPtr)

新しいを返しますGCHandleマネージ オブジェクトを識別するハンドルから作成されたオブジェクト。Returns a new GCHandle object created from a handle to a managed object.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

現在の識別子を返しますGCHandleオブジェクト。Returns an identifier for the current GCHandle object.

ToIntPtr(GCHandle) ToIntPtr(GCHandle) ToIntPtr(GCHandle) ToIntPtr(GCHandle)

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

演算子

Equality(GCHandle, GCHandle) Equality(GCHandle, GCHandle) Equality(GCHandle, GCHandle) Equality(GCHandle, GCHandle)

2 つかどうかを示す値を返しますGCHandleオブジェクトが等しい。Returns a value indicating whether two GCHandle objects are equal.

Explicit(IntPtr to GCHandle) Explicit(IntPtr to GCHandle) Explicit(IntPtr to GCHandle) Explicit(IntPtr to GCHandle)

AGCHandle内部整数表現を使用して格納されます。A GCHandle is stored using an internal integer representation.

Explicit(GCHandle to IntPtr) Explicit(GCHandle to IntPtr) Explicit(GCHandle to IntPtr) Explicit(GCHandle to IntPtr)

AGCHandle内部整数表現を使用して格納されます。A GCHandle is stored using an internal integer representation.

Inequality(GCHandle, GCHandle) Inequality(GCHandle, GCHandle) Inequality(GCHandle, GCHandle) Inequality(GCHandle, GCHandle)

2 つかどうかを示す値を返しますGCHandleオブジェクトが等しくないです。Returns a value indicating whether two GCHandle objects are not equal.

適用対象

こちらもご覧ください