GCHandle Struktura

Definicja

Zapewnia sposób uzyskiwania dostępu do obiektu zarządzanego 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 uchwyt do obiektu zarządzanego przy użyciu GCHandle.Alloc metody, która uniemożliwia zbieranie zarządzanego obiektu. Wywołanie EnumWindows metody przekazuje delegata i obiekt zarządzany (zadeklarowany jako typy zarządzane, ale nie są wyświetlane) i rzutuje uchwyt na IntPtrobiekt . Funkcja niezarządzana 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, , Normal``WeakTrackResurrectionlub Pinned. Po przydzieleniu uchwytu 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 zostać zebrany przez moduł odśmiecenia pamięci przed ukończeniem pracy w imieniu niezarządzanego klienta.

Można również użyć GCHandle do utworzenia przypiętego obiektu zwracającego adres pamięci, aby zapobiec przeniesieniu obiektu w pamięci przez moduł odśmiecenia pamięci.

Gdy uchwyt wykracza poza zakres, musisz jawnie go zwolnić, wywołując metodę Free . W przeciwnym razie mogą wystąpić przecieki pamięci. Po uwolnieniu przypiętego uchwytu skojarzony obiekt zostanie odpięty i stanie się uprawniony do odzyskiwania pamięci, jeśli nie ma do niego żadnych innych odwołań.

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)

Normal Przydziela uchwyt 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 obiektu zarządzanego.

GetHashCode()

Zwraca identyfikator bieżącego GCHandle obiektu.

ToIntPtr(GCHandle)

Zwraca wewnętrzną reprezentację GCHandle całkowitą obiektu.

Operatory

Equality(GCHandle, GCHandle)

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

Explicit(GCHandle to IntPtr)

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

Explicit(IntPtr to GCHandle)

Element A 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ż