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
특성

예제

다음 예제에서는 관리 되는 개체가 수집 되지 않도록 방지 하는 GCHandle.Alloc 메서드를 사용 하 여 관리 되는 개체에 대 한 핸들을 만드는 App 클래스를 보여 줍니다.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.

적용 대상

추가 정보