GCHandle GCHandle GCHandle GCHandle Struct

Definizione

Fornisce un modo per accedere a un oggetto gestito da una memoria non gestita.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
Ereditarietà
Attributi

Esempi

L'esempio seguente mostra un' App classe che crea un handle a un oggetto gestito usando il GCHandle.Alloc metodo, che impedisce l'oggetto gestito di raccolta.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 chiamata per il EnumWindows metodo passa un delegato e un oggetto gestito (sia dichiarato come tipi gestiti ma non illustrato) e imposta l'handle per 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 funzione non gestita passa il tipo di ritorno al chiamante come parametro della funzione di callback.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

Commenti

Il GCHandle struttura venga utilizzata con la GCHandleType enumerazione per creare un handle corrispondenti a qualsiasi oggetto gestito.The GCHandle structure is used with the GCHandleType enumeration to create a handle corresponding to any managed object. Questo handle può essere uno dei quattro tipi: Weak, WeakTrackResurrection, Normal, o Pinned.This handle can be one of four types: Weak, WeakTrackResurrection, Normal, or Pinned. Quando l'handle è stato allocato, è possibile usarlo per impedire che venga raccolto dal garbage collector quando un client non gestito contiene l'unico riferimento all'oggetto gestito.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. Senza tale handle, l'oggetto può essere raccolto dal garbage collector prima del completamento delle operazioni per conto del client non gestito.Without such a handle, the object can be collected by the garbage collector before completing its work on behalf of the unmanaged client.

È anche possibile usare GCHandle per creare un oggetto aggiunto che restituisce un indirizzo di memoria per impedire al garbage collector di spostare l'oggetto in 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.

Quando l'handle abbandona l'ambito è necessario rilasciarlo in modo esplicito chiamando il Free metodo; in caso contrario, memoria, possono verificarsi perdite di.When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. Quando si libera un handle bloccato, l'oggetto associato verrà sbloccato e diventa idonea per garbage collection, se non sono presenti altri riferimenti a esso.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.

Proprietà

IsAllocated IsAllocated IsAllocated IsAllocated

Ottiene un valore che indica se l'handle è allocato.Gets a value indicating whether the handle is allocated.

Target Target Target Target

Ottiene o imposta l'oggetto rappresentato da questo handle.Gets or sets the object this handle represents.

Metodi

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

Recupera l'indirizzo di un oggetto in un Pinned gestire.Retrieves the address of an object in a Pinned handle.

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

Alloca un Normal gestire per l'oggetto specificato.Allocates a Normal handle for the specified object.

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

Alloca un handle del tipo specificato per l'oggetto specificato.Allocates a handle of the specified type for the specified object.

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

Determina se l'oggetto specificato GCHandle oggetto è uguale all'oggetto corrente GCHandle oggetto.Determines whether the specified GCHandle object is equal to the current GCHandle object.

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

Rilascia un GCHandle.Releases a GCHandle.

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

Restituisce un nuovo GCHandle oggetto creato da un handle a un oggetto gestito.Returns a new GCHandle object created from a handle to a managed object.

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

Restituisce un identificatore per l'oggetto corrente GCHandle oggetto.Returns an identifier for the current GCHandle object.

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

Restituisce la rappresentazione interna di interi di una GCHandle oggetto.Returns the internal integer representation of a GCHandle object.

Operatori

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

Restituisce un valore che indica se due GCHandle oggetti sono uguali.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)

Oggetto GCHandle viene archiviato usando una rappresentazione interna di interi.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)

Oggetto GCHandle viene archiviato usando una rappresentazione interna di interi.A GCHandle is stored using an internal integer representation.

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

Restituisce un valore che indica se due GCHandle oggetti non sono uguali.Returns a value indicating whether two GCHandle objects are not equal.

Si applica a

Vedi anche