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.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

注釈

構造体は、任意のGCHandleTypeマネージオブジェクトに対応するハンドルを作成するために、列挙体と共に使用されます。 GCHandleThe GCHandle structure is used with the GCHandleType enumeration to create a handle corresponding to any managed object. このWeakハンドルはWeakTrackResurrection Pinned、、、、の4つの型のいずれかになります。 NormalThis 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 object data 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)

GCHandle の 2 つのオブジェクトが等しいかどうかを示す値を返します。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)

GCHandle は、内部整数表現を使用して格納されます。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)

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

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

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

適用対象

こちらもご覧ください