GCHandle Struktúra

Definíció

Lehetővé teszi a felügyelt objektumok nem felügyelt memóriából való elérését.

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)
Öröklődés
GCHandle
Attribútumok
Megvalósítás

Példák

Az alábbi példa egy App olyan osztályt mutat be, amely a metódus használatával GCHandle.Alloc létrehoz egy leírót egy felügyelt objektumhoz, amely megakadályozza a felügyelt objektum gyűjtését. A metódus hívása EnumWindows átad egy delegáltat és egy felügyelt objektumot (mindkettő felügyelt típusként van deklarálva, de nem jelenik meg), és a leírót egy IntPtr. A nem felügyelt függvény visszaadja a típust a hívónak a visszahívási függvény paramétereként.

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

Megjegyzések

A GCHandle struktúra az GCHandleType enumerálással egy felügyelt objektumnak megfelelő leíró létrehozásához használható. Ez a fogópont a következő négy típus egyike lehet: Weak, WeakTrackResurrection, Normalvagy Pinned. A leíró lefoglalása után megakadályozhatja, hogy a felügyelt objektumot a szemétgyűjtő összegyűjtse, ha egy nem felügyelt ügyfél rendelkezik az egyetlen hivatkozással. Ilyen leíró nélkül az objektumot összegyűjtheti a szemétgyűjtő, mielőtt befejezné a munkát a nem felügyelt ügyfél nevében.

Olyan rögzített objektumot is GCHandle létrehozhat, amely memóriacímet ad vissza, hogy megakadályozza, hogy a szemétgyűjtő áthelyezze az objektumot a memóriába.

Ha a leíró kiesik a hatókörből, a metódus meghívásával Free explicit módon fel kell szabadítania; ellenkező esetben memóriavesztés léphet fel. Rögzített fogópont felszabadításakor a társított objektum nem lesz rögzítve, és jogosulttá válik a szemétgyűjtésre, ha nincs más hivatkozás rá.

Tulajdonságok

Name Description
IsAllocated

Lekérdez egy értéket, amely jelzi, hogy a leíró lefoglalva van-e.

Target

Lekéri vagy beállítja a leíró által képviselt objektumot.

Metódusok

Name Description
AddrOfPinnedObject()

Lekéri az objektumadatok címét egy Pinned leíróban.

Alloc(Object, GCHandleType)

A megadott típusú leírót foglalja le a megadott objektumhoz.

Alloc(Object)

Lekért egy Normal leírót a megadott objektumhoz.

Equals(GCHandle)

Azt jelzi, hogy az aktuális példány egyenlő-e egy másik, azonos típusú példánysal.

Equals(Object)

Meghatározza, hogy a megadott GCHandle objektum egyenlő-e az aktuális GCHandle objektummal.

Free()

Felszabadítja a GCHandle.

FromIntPtr(IntPtr)

Egy leíróból létrehozott új GCHandle objektumot ad vissza egy felügyelt objektumnak.

GetHashCode()

Az aktuális GCHandle objektum azonosítóját adja vissza.

ToIntPtr(GCHandle)

Egy objektum belső egész számának ábrázolását GCHandle adja vissza.

Operátorok

Name Description
Equality(GCHandle, GCHandle)

Egy értéket ad vissza, amely jelzi, hogy két GCHandle objektum egyenlő-e.

Explicit(GCHandle to IntPtr)

Az A-t GCHandle belső egész számábrázolással tárolja a rendszer.

Explicit(IntPtr to GCHandle)

Az A-t GCHandle belső egész számábrázolással tárolja a rendszer.

Inequality(GCHandle, GCHandle)

Egy értéket ad vissza, amely jelzi, hogy két GCHandle objektum nem egyenlő-e.

A következőre érvényes:

Lásd még