GCHandle Estructura

Definición

Proporciona una forma de obtener acceso a un objeto administrado desde la memoria no administrada.

public value class GCHandle
public value class GCHandle : IEquatable<System::Runtime::InteropServices::GCHandle>
public struct GCHandle
public struct GCHandle : IEquatable<System.Runtime.InteropServices.GCHandle>
[System.Runtime.InteropServices.ComVisible(true)]
public struct GCHandle
type GCHandle = struct
[<System.Runtime.InteropServices.ComVisible(true)>]
type GCHandle = struct
Public Structure GCHandle
Public Structure GCHandle
Implements IEquatable(Of GCHandle)
Herencia
GCHandle
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se muestra una App clase que crea un identificador para un objeto administrado mediante el GCHandle.Alloc método , lo que impide que se recopile el objeto administrado. Una llamada al EnumWindows método pasa un delegado y un objeto administrado (ambos declarados como tipos administrados, pero no mostrados) y convierte el identificador en .IntPtr La función no administrada pasa el tipo al autor de la llamada como parámetro de la función de devolución de llamada.

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

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

internal static class NativeMethods
{
    // passing managed object as LPARAM
    // BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);

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

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

    public static void Run()
    {
        TextWriter tw = Console.Out;
        GCHandle gch = GCHandle.Alloc(tw);

        CallBack cewp = new CallBack(CaptureEnumWindowsProc);

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

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


Friend Module NativeMethods

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


Module App

    Sub Main()

        Run()

    End Sub

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

        Dim tw As TextWriter = 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
        NativeMethods.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

La GCHandle estructura se usa con la GCHandleType enumeración para crear un identificador correspondiente a cualquier objeto administrado. Este identificador puede ser uno de los cuatro tipos: Weak, WeakTrackResurrection, Normalo Pinned. Cuando se haya asignado el identificador, puede usarlo para evitar que el recolector de elementos no utilizados recopile el objeto administrado cuando un cliente no administrado contenga la única referencia. Sin este identificador, el recolector de elementos no utilizados puede recopilar el objeto antes de completar su trabajo en nombre del cliente no administrado.

También puede usar GCHandle para crear un objeto anclado que devuelva una dirección de memoria para evitar que el recolector de elementos no utilizados mueva el objeto en memoria.

Cuando el identificador sale del ámbito, debe liberarlo explícitamente llamando al Free método ; de lo contrario, se pueden producir pérdidas de memoria. Al liberar un identificador anclado, el objeto asociado se desanclará y se convertirá en apto para la recolección de elementos no utilizados, si no hay otras referencias a él.

Propiedades

IsAllocated

Obtiene un valor que indica si el identificador está asignado.

Target

Obtiene o establece el objeto al que representa este identificador.

Métodos

AddrOfPinnedObject()

Recupera la dirección de los datos de objeto en un identificador Pinned.

Alloc(Object)

Asigna un identificador Normal para el objeto especificado.

Alloc(Object, GCHandleType)

Asigna un identificador del tipo especificado para el objeto especificado.

Equals(GCHandle)

Indica si la instancia actual es igual a otra instancia del mismo tipo.

Equals(Object)

Determina si el objeto GCHandle especificado es igual al objeto GCHandle actual.

Free()

Libera un GCHandle.

FromIntPtr(IntPtr)

Devuelve un nuevo objeto GCHandle creado a partir de un identificador a un objeto administrado.

GetHashCode()

Devuelve un identificador para el objeto GCHandle actual.

ToIntPtr(GCHandle)

Devuelve la representación entera interna de un objeto GCHandle.

Operadores

Equality(GCHandle, GCHandle)

Devuelve un valor que indica si dos objetos GCHandle son iguales.

Explicit(GCHandle to IntPtr)

Un GCHandle se almacena mediante una representación de entero interna.

Explicit(IntPtr to GCHandle)

Un GCHandle se almacena mediante una representación de entero interna.

Inequality(GCHandle, GCHandle)

Devuelve un valor que indica si dos objetos GCHandle no son iguales.

Se aplica a

Consulte también