다음을 통해 공유


GCHandle 구조체

관리되지 않는 메모리에서 관리되는 개체에 액세스하기 위한 방법을 제공합니다.

네임스페이스: System.Runtime.InteropServices
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<ComVisibleAttribute(True)> _
Public Structure GCHandle
‘사용 방법
Dim instance As GCHandle
[ComVisibleAttribute(true)] 
public struct GCHandle
[ComVisibleAttribute(true)] 
public value class GCHandle
/** @attribute ComVisibleAttribute(true) */ 
public final class GCHandle extends ValueType
JScript에서는 구조체를 사용할 수 있지만 새로 선언할 수는 없습니다.

설명

GCHandle 클래스는 관리되는 개체에 해당하는 핸들을 만들기 위해 GCHandleType 열거형과 함께 사용됩니다. 이 핸들은 Weak, WeakTrackResurrection, Normal 또는 Pinned 네 가지 형식 중 하나입니다. 할당된 GCHandle을 사용하면 관리되지 않는 클라이언트에서 유일한 참조를 보유할 경우 가비지 수집기가 관리되는 개체를 수집하지 않도록 할 수 있습니다. 이러한 핸들이 없으면 개체가 관리되는 클라이언트 대신 해당 작업을 완료하기 전에 가지비 수집기에서 개체를 수집할 수 있습니다.

GCHandle을 사용하면 메모리 주소를 반환하고 가비지 수집기가 메모리의 개체를 이동하지 않게 하는 고정 개체를 만들 수 있습니다.

예제

다음 예제에서는 관리되는 개체가 수집되지 않도록 하는 GCHandle.Alloc 메서드를 사용하여 관리되는 개체에 대한 핸들을 만드는 App 클래스를 보여 줍니다. EnumWindows 메서드 호출은 관리되는 형식으로 선언되었지만 표시되지 않는 대리자 및 관리되는 개체를 전달하고 핸들을 IntPtr로 캐스팅합니다. 관리되지 않는 함수는 해당 형식을 콜백 함수의 매개 변수로 호출자에게 다시 전달합니다.

Imports System
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


Module LibWrap

    ' passing managed object as LPARAM
    ' BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);
    <DllImport("user32.dll")> _
    Function EnumWindows(ByVal cb As CallBack, ByVal param As IntPtr) As Boolean
    End Function
End Module 'LibWrap


Module App

    Sub Main()
    Run()

    End Sub

    <SecurityPermission(SecurityAction.Demand, UnmanagedCode:=true)> _
    Sub Run()

        Dim tw As TextWriter = System.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
        LibWrap.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
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);

public class LibWrap
{
    // passing managed object as LPARAM
    // BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);

    [DllImport("user32.dll")]
    public 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 = System.Console.Out;
        GCHandle gch = GCHandle.Alloc(tw);

        CallBack cewp = new CallBack(CaptureEnumWindowsProc);

        // platform invoke will prevent delegate to be garbage collected
        // before call ends

        LibWrap.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;
    }
}

스레드로부터의 안전성

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

참고 항목

참조

GCHandle 멤버
System.Runtime.InteropServices 네임스페이스
GCHandleType