GCHandle Estructura
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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
- 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
, Normal
o 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. |