GCHandle GCHandle GCHandle GCHandle Struct

Definición

Proporciona una forma de obtener acceso a un objeto administrado desde la memoria no administrada.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
Herencia
Atributos

Ejemplos

El ejemplo siguiente se muestra un App clase que crea un identificador para un objeto administrado mediante el GCHandle.Alloc método, lo que impide que el objeto administrado que se recopilan.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. Una llamada a la EnumWindows método pasa un delegado y un objeto administrado (ambos declarados como tipos administrados, pero no se muestra) y convierte el identificador para un 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. La función no administrada, pasa el tipo de vuelta al llamador como un parámetro de la función de devolución de llamada.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

Comentarios

El GCHandle estructura se usa con el GCHandleType enumeración para crear un identificador que corresponde a cualquier objeto administrado.The GCHandle structure is used with the GCHandleType enumeration to create a handle corresponding to any managed object. Este identificador puede ser uno de los cuatro tipos: Weak, WeakTrackResurrection, Normal, o Pinned.This handle can be one of four types: Weak, WeakTrackResurrection, Normal, or Pinned. Cuando se ha asignado el identificador, puede usarlo para evitar que el objeto administrado que se recopilan por el recolector de elementos no utilizados cuando un cliente no administrado contiene la única referencia.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. Sin un identificador de este tipo, se puede recopilar el objeto por el recolector de elementos no utilizados antes de completar su trabajo en nombre del cliente no administrado.Without such a handle, the object can be collected by the garbage collector before completing its work on behalf of the unmanaged client.

También puede usar GCHandle para crear un objeto anclado que se devuelve una dirección de memoria para evitar que el recolector de elementos no utilizados traslade el objeto en memoria.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.

Cuando el controlador sale del ámbito explícitamente debe liberar mediante una llamada a la Free método; pueden producirse pérdidas de memoria en caso contrario,.When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. Al liberar un identificador anclado, el objeto asociado se liberarán y se convertirán en apto para la recolección, si no hay ninguna otra referencia a él.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.

Propiedades

IsAllocated IsAllocated IsAllocated IsAllocated

Obtiene un valor que indica si el identificador está asignado.Gets a value indicating whether the handle is allocated.

Target Target Target Target

Obtiene o establece el objeto al que representa este identificador.Gets or sets the object this handle represents.

Métodos

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

Recupera la dirección de un objeto en un identificador Pinned.Retrieves the address of an object in a Pinned handle.

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

Asigna un identificador Normal para el objeto especificado.Allocates a Normal handle for the specified object.

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

Asigna un identificador del tipo especificado para el objeto especificado.Allocates a handle of the specified type for the specified object.

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

Determina si el objeto GCHandle especificado es igual al objeto GCHandle actual.Determines whether the specified GCHandle object is equal to the current GCHandle object.

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

Libera un GCHandle.Releases a GCHandle.

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

Devuelve un nuevo objeto GCHandle creado a partir de un identificador a un objeto administrado.Returns a new GCHandle object created from a handle to a managed object.

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

Devuelve un identificador para el objeto GCHandle actual.Returns an identifier for the current GCHandle object.

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

Devuelve la representación entera interna de un objeto GCHandle.Returns the internal integer representation of a GCHandle object.

Operadores

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

Devuelve un valor que indica si dos objetos GCHandle son iguales.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)

Un GCHandle se almacena mediante una representación de entero interna.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)

Un GCHandle se almacena mediante una representación de entero interna.A GCHandle is stored using an internal integer representation.

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

Devuelve un valor que indica si dos objetos GCHandle no son iguales.Returns a value indicating whether two GCHandle objects are not equal.

Se aplica a

Consulte también: