GCHandle Структура

Определение

Предоставляет способ доступа к управляемому объекту из неуправляемой памяти.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
Наследование
GCHandle
Атрибуты

Примеры

В следующем примере показан App класс, который создает обработчик для управляемого объекта GCHandle.Alloc с помощью метода, который предотвращает сбор управляемого объекта.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. Вызов EnumWindows метода передает делегат и управляемый объект (оба объявляются как управляемые типы, но не отображаются) и приводит этот обработчик IntPtrк типу.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. Неуправляемая функция передает тип обратно вызывающему объекту в качестве параметра функции обратного вызова.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);

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

    [SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
    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

Комментарии

GCHandle Структура используется GCHandleType с перечислением для создания маркера, соответствующего любому управляемому объекту.The GCHandle structure is used with the GCHandleType enumeration to create a handle corresponding to any managed object. Этот обработчик может иметь один из четырех типов: Weak, WeakTrackResurrection, Normalили Pinned.This handle can be one of four types: Weak, WeakTrackResurrection, Normal, or Pinned. После выделения маркера его можно использовать для предотвращения сбора управляемого объекта сборщиком мусора, если неуправляемый клиент содержит единственную ссылку.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. Без такого маркера объект может быть собран сборщиком мусора до завершения его работы от имени неуправляемого клиента.Without such a handle, the object can be collected by the garbage collector before completing its work on behalf of the unmanaged client.

Можно также использовать GCHandle для создания закрепленного объекта, который возвращает адрес памяти, чтобы сборщик мусора не мог переместить объект в памяти.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.

Когда дескриптор выходит из области действия, необходимо явно освободить его, вызвав Free метод; в противном случае могут возникнуть утечки памяти.When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. При освобождении закрепленного маркера связанный объект будет откреплен и станет пригодным для сборки мусора, если в нем нет других ссылок.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.

Свойства

IsAllocated

Возвращает значение, показывающее, выделен ли дескриптор.Gets a value indicating whether the handle is allocated.

Target

Возвращает или задает объект, предоставляемый дескриптором.Gets or sets the object this handle represents.

Методы

AddrOfPinnedObject()

Получает адрес данных объекта в маркере Pinned.Retrieves the address of object data in a Pinned handle.

Alloc(Object)

Выделяет дескриптор Normal для указанного объекта.Allocates a Normal handle for the specified object.

Alloc(Object, GCHandleType)

Выделяет дескриптор указанного типа для указанного объекта.Allocates a handle of the specified type for the specified object.

Equals(Object)

Определяет, равен ли заданный объект GCHandle текущему объекту GCHandle.Determines whether the specified GCHandle object is equal to the current GCHandle object.

Free()

Освобождает дескриптор GCHandle.Releases a GCHandle.

FromIntPtr(IntPtr)

Возвращает новый объект GCHandle, созданный из дескриптора управляемого объекта.Returns a new GCHandle object created from a handle to a managed object.

GetHashCode()

Возвращает идентификатор текущего объекта GCHandle.Returns an identifier for the current GCHandle object.

ToIntPtr(GCHandle)

Возвращает внутреннее целочисленное представление объекта GCHandle.Returns the internal integer representation of a GCHandle object.

Операторы

Equality(GCHandle, GCHandle)

Возвращает значение, показывающее, равны ли два объекта GCHandle.Returns a value indicating whether two GCHandle objects are equal.

Explicit(GCHandle to IntPtr)

Дескриптор GCHandle хранится в виде целого числа как внутреннего представления.A GCHandle is stored using an internal integer representation.

Explicit(IntPtr to GCHandle)

Дескриптор GCHandle хранится в виде целого числа как внутреннего представления.A GCHandle is stored using an internal integer representation.

Inequality(GCHandle, GCHandle)

Возвращает значение, показывающее, являются ли два объекта GCHandle неравными.Returns a value indicating whether two GCHandle objects are not equal.

Применяется к

Дополнительно