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方法将传递委托,而托管的对象 (两者都声明为托管类型,但不是显示),并将强制转换的句柄IntPtrA 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. 此句柄可以是以下四种类型之一: WeakWeakTrackResurrectionNormal,或PinnedThis 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()

版本GCHandleReleases 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对象是否相等。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对象是否不相等。Returns a value indicating whether two GCHandle objects are not equal.

适用于

另请参阅