Freigeben über


GCHandle-Struktur

Stellt eine Möglichkeit für den Zugriff aus nicht verwaltetem Speicher auf ein verwaltetes Objekt bereit.

Namespace: System.Runtime.InteropServices
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
<ComVisibleAttribute(True)> _
Public Structure GCHandle
'Usage
Dim instance As GCHandle
[ComVisibleAttribute(true)] 
public struct GCHandle
[ComVisibleAttribute(true)] 
public value class GCHandle
/** @attribute ComVisibleAttribute(true) */ 
public final class GCHandle extends ValueType
JScript unterstützt die Verwendung von Strukturen, aber nicht die Deklaration von neuen Strukturen.

Hinweise

Die GCHandle-Klasse wird zusammen mit der GCHandleType-Enumeration verwendet, um ein Handle zu erstellen, das einem verwalteten Objekt entspricht. Die folgenden vier Handle-Typen sind möglich: Weak, WeakTrackResurrection, Normal und Pinned. Nach der Reservierung können Sie mit einem GCHandle verhindern, dass das verwaltete Objekt vom Garbage Collector erfasst wird, wenn ein nicht verwalteter Client den einzigen Verweis enthält. Ohne ein solches Handle kann das Objekt vom Garbage Collector erfasst werden, bevor es seine Aufgabe für den nicht verwalteten Client abgeschlossen hat.

Sie können mit dem GCHandle auch ein fixiertes Objekt erstellen, das eine Speicheradresse zurückgibt und verhindert, dass der Garbage Collector das Objekt im Speicher verschiebt.

Beispiel

Im folgenden Beispiel wird eine App-Klasse dargestellt, die unter Verwendung der GCHandle.Alloc-Methode ein Handle für ein verwaltetes Objekt erstellt. Dadurch wird das Erfassen des verwalteten Objekts durch den Garbage Collector verhindert. Durch einen Aufruf der EnumWindows-Methode werden ein Delegat und ein verwaltetes Objekt übergeben (beide sind als verwaltete Typen deklariert, werden jedoch nicht angezeigt), und das Handle wird in ein IntPtr umgewandelt. Die nicht verwaltete Funktion gibt den Typ als Parameter der Rückruffunktion an den Aufrufer zurück.

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
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;
    }
}

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

GCHandle-Member
System.Runtime.InteropServices-Namespace
GCHandleType