GCHandle Struktura
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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
- 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
, Normal
lub 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. |