GCHandle GCHandle GCHandle GCHandle Struct

Definition

Bietet die Möglichkeit, aus nicht verwaltetem Speicher auf ein verwaltetes Objekt zuzugreifen.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
Vererbung
Attribute

Beispiele

Das folgende Beispiel zeigt eine App -Klasse, die mithilfe der GCHandle.Alloc -Methode ein Handle für ein verwaltetes Objekt erstellt, das verhindert, dass das verwaltete Objekt erfasst wird.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. Ein Aufruf der EnumWindows -Methode übergibt einen Delegaten und ein verwaltetes Objekt (beide als verwaltete Typen deklariert, jedoch nicht angezeigt) und wandelt das Handle in IntPtreinen um.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. Die nicht verwaltete Funktion übergibt den Typ als Parameter der Rückruffunktion an den Aufrufer zurück.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.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

Hinweise

Die GCHandle -Struktur wird mit der GCHandleType -Enumeration verwendet, um ein Handle zu erstellen, das einem beliebigen verwalteten Objekt entspricht.The GCHandle structure is used with the GCHandleType enumeration to create a handle corresponding to any managed object. Dieses Handle kann einen von vier Typen aufweisen: Weak, WeakTrackResurrection, Normaloder Pinned.This handle can be one of four types: Weak, WeakTrackResurrection, Normal, or Pinned. Wenn das Handle zugewiesen wurde, können Sie es verwenden, um zu verhindern, dass das verwaltete Objekt vom Garbage Collector gesammelt wird, wenn ein nicht verwalteter Client den einzigen Verweis enthält.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. Ohne dieses Handle kann das Objekt von der Garbage Collector erfasst werden, bevor die Arbeit im Auftrag des nicht verwalteten Clients abgeschlossen wird.Without such a handle, the object can be collected by the garbage collector before completing its work on behalf of the unmanaged client.

Sie können auch verwenden GCHandle , um ein angeheftete Objekt zu erstellen, das eine Speicheradresse zurückgibt, um zu verhindern, dass der Garbage Collector das Objekt im Speicher verschiebt.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.

Wenn das Handle den Gültigkeitsbereich verlässt, müssen Sie es explizit freigeben, Free indem Sie die-Methode aufrufen; andernfalls können Speicher Verluste auftreten.When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. Wenn Sie ein angeheftete handle freigeben, wird das zugehörige Objekt gelöst und wird für Garbage Collection qualifiziert, wenn keine anderen Verweise vorhanden sind.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.

Eigenschaften

IsAllocated IsAllocated IsAllocated IsAllocated

Ruft einen Wert ab, der angibt, ob das Handle reserviert ist.Gets a value indicating whether the handle is allocated.

Target Target Target Target

Ruft das Objekt ab, das von diesem Handle dargestellt wird, oder legt dieses fest.Gets or sets the object this handle represents.

Methoden

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

Ruft die Adresse von Objektdaten in einem Pinned-Handle ab.Retrieves the address of object data in a Pinned handle.

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

Reserviert ein Normal-Handle für das angegebene Objekt.Allocates a Normal handle for the specified object.

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

Reserviert ein Handle vom angegebenen Typ für das angegebene Objekt.Allocates a handle of the specified type for the specified object.

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

Bestimmt, ob das angegebene GCHandle-Objekt mit dem aktuellen GCHandle-Objekt identisch ist.Determines whether the specified GCHandle object is equal to the current GCHandle object.

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

Gibt ein GCHandle frei.Releases a GCHandle.

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

Gibt ein neues GCHandle-Objekt zurück, das aus einem Handle für ein verwaltetes Objekt erstellt wurde.Returns a new GCHandle object created from a handle to a managed object.

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

Gibt einen Bezeichner für das aktuelle GCHandle-Objekt zurück.Returns an identifier for the current GCHandle object.

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

Gibt die interne Ganzzahldarstellung eines GCHandle-Objekts zurück.Returns the internal integer representation of a GCHandle object.

Operatoren

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

Gibt einen Wert zurück, der angibt, ob zwei GCHandle-Objekte gleich sind.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)

Ein GCHandle wird mithilfe einer internen Ganzzahldarstellung gespeichert.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)

Ein GCHandle wird mithilfe einer internen Ganzzahldarstellung gespeichert.A GCHandle is stored using an internal integer representation.

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

Gibt einen Wert zurück, der angibt, ob zwei GCHandle-Objekte ungleich sind.Returns a value indicating whether two GCHandle objects are not equal.

Gilt für:

Siehe auch