GCHandle Struktura

Definicja

Zapewnia dostęp do zarządzanego obiektu z niezarządzanej pamięci.

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)
Dziedziczenie
GCHandle
Atrybuty
Implementuje

Przykłady

W poniższym przykładzie pokazano klasę App , która tworzy dojście do obiektu zarządzanego przy użyciu GCHandle.Alloc metody , co uniemożliwia zbieranie zarządzanego obiektu. Wywołanie EnumWindows metody przekazuje delegata i obiekt zarządzany (zarówno zadeklarowany jako typy zarządzane, ale nie pokazane), jak i rzutuje uchwyt na obiekt IntPtr. Niezarządzana funkcja przekazuje typ z powrotem do obiektu wywołującego jako parametr funkcji wywołania zwrotnego.

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

Uwagi

Struktura GCHandle jest używana z wyliczeniem w celu utworzenia uchwytu GCHandleType odpowiadającego dowolnemu obiektowi zarządzanemu. Ten uchwyt może być jednym z czterech typów: Weak, WeakTrackResurrection, Normallub Pinned. Po przydzieleniu dojścia można go użyć, aby uniemożliwić zbieranie zarządzanego obiektu przez moduł odśmiecanie pamięci, gdy niezarządzany klient przechowuje jedyne odwołanie. Bez takiego uchwytu obiekt może być zbierany przez moduł odśmiecanie pamięci przed ukończeniem pracy w imieniu niezarządzanego klienta.

Można również użyć GCHandle polecenia , aby utworzyć przypięty obiekt, który zwraca adres pamięci, aby zapobiec przeniesieniu obiektu w pamięci przez moduł odśmiecania pamięci.

Gdy dojście wykracza poza zakres, należy go jawnie zwolnić, wywołując metodę Free . W przeciwnym razie mogą wystąpić przecieki pamięci. Gdy zwolnisz przypięty uchwyt, skojarzony obiekt zostanie odpięty i będzie kwalifikować się do odzyskiwania pamięci, jeśli nie ma innych odwołań do niego.

Właściwości

IsAllocated

Pobiera wartość wskazującą, czy dojście jest przydzielone.

Target

Pobiera lub ustawia obiekt, który reprezentuje ten uchwyt.

Metody

AddrOfPinnedObject()

Pobiera adres danych obiektu w dojściu Pinned .

Alloc(Object)

Przydziela dojście Normal dla określonego obiektu.

Alloc(Object, GCHandleType)

Przydziela uchwyt określonego typu dla określonego obiektu.

Equals(GCHandle)

Wskazuje, czy bieżące wystąpienie jest równe innemu wystąpieniu tego samego typu.

Equals(Object)

Określa, czy określony GCHandle obiekt jest równy bieżącemu GCHandle obiektowi.

Free()

Zwalnia element GCHandle.

FromIntPtr(IntPtr)

Zwraca nowy GCHandle obiekt utworzony na podstawie uchwytu do zarządzanego obiektu.

GetHashCode()

Zwraca identyfikator bieżącego GCHandle obiektu.

ToIntPtr(GCHandle)

Zwraca wewnętrzną reprezentację GCHandle liczb całkowitych obiektu.

Operatory

Equality(GCHandle, GCHandle)

Zwraca wartość wskazującą, czy dwa GCHandle obiekty są równe.

Explicit(GCHandle to IntPtr)

Obiekt GCHandle jest przechowywany przy użyciu wewnętrznej reprezentacji całkowitej.

Explicit(IntPtr to GCHandle)

Obiekt GCHandle jest przechowywany przy użyciu wewnętrznej reprezentacji całkowitej.

Inequality(GCHandle, GCHandle)

Zwraca wartość wskazującą, czy dwa GCHandle obiekty nie są równe.

Dotyczy

Zobacz też