GCHandle Struct
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Biedt een manier om toegang te krijgen tot een beheerd object vanuit onbeheerd geheugen.
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)
- Overname
- Kenmerken
- Implementeringen
Voorbeelden
In het volgende voorbeeld ziet u een App klasse waarmee een ingang voor een beheerd object wordt gemaakt met behulp van de GCHandle.Alloc methode, waardoor het beheerde object niet kan worden verzameld. Een aanroep van de EnumWindows methode geeft een gemachtigde en een beheerd object door (beide gedeclareerd als beheerde typen, maar niet weergegeven), en cast de ingang naar een IntPtr. De niet-beheerde functie geeft het type terug aan de aanroeper als parameter van de callback-functie.
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
Opmerkingen
De GCHandle structuur wordt gebruikt met de GCHandleType opsomming om een ingang te maken die overeenkomt met elk beheerd object. Deze greep kan een van de vier typen zijn: Weak, WeakTrackResurrection, Normalof Pinned. Wanneer de ingang is toegewezen, kunt u deze gebruiken om te voorkomen dat het beheerde object door de garbagecollector wordt verzameld wanneer een niet-beheerde client de enige verwijzing bevat. Zonder een dergelijke ingang kan het object worden verzameld door de garbagecollector voordat het werk namens de niet-beheerde client wordt voltooid.
U kunt ook GCHandle een vastgemaakt object maken dat een geheugenadres retourneert om te voorkomen dat de garbagecollector het object in het geheugen verplaatst.
Wanneer de ingang buiten het bereik valt, moet u deze expliciet vrijgeven door de Free methode aan te roepen. Anders kunnen geheugenlekken optreden. Wanneer u een vastgemaakte ingang vrijmaakt, wordt het bijbehorende object losgemaakt en komt het in aanmerking voor garbagecollection als er geen andere verwijzingen naar zijn.
Eigenschappen
| Name | Description |
|---|---|
| IsAllocated |
Hiermee wordt een waarde opgehaald die aangeeft of de ingang is toegewezen. |
| Target |
Hiermee wordt het object opgehaald of ingesteld dat deze ingang vertegenwoordigt. |
Methoden
| Name | Description |
|---|---|
| AddrOfPinnedObject() |
Hiermee haalt u het adres van objectgegevens in een Pinned ingang op. |
| Alloc(Object, GCHandleType) |
Hiermee wijst u een ingang van het opgegeven type toe voor het opgegeven object. |
| Alloc(Object) |
Hiermee wijst u een Normal ingang toe voor het opgegeven object. |
| Equals(GCHandle) |
Geeft aan of het huidige exemplaar gelijk is aan een ander exemplaar van hetzelfde type. |
| Equals(Object) |
Bepaalt of het opgegeven GCHandle object gelijk is aan het huidige GCHandle object. |
| Free() |
Brengt een GCHandle. |
| FromIntPtr(IntPtr) |
Hiermee wordt een nieuw GCHandle object geretourneerd dat is gemaakt van een ingang naar een beheerd object. |
| GetHashCode() |
Retourneert een id voor het huidige GCHandle object. |
| ToIntPtr(GCHandle) |
Retourneert de interne gehele getalweergave van een GCHandle object. |
Operators
| Name | Description |
|---|---|
| Equality(GCHandle, GCHandle) |
Retourneert een waarde die aangeeft of twee GCHandle objecten gelijk zijn. |
| Explicit(GCHandle to IntPtr) |
Een GCHandle wordt opgeslagen met behulp van een interne gehele getalweergave. |
| Explicit(IntPtr to GCHandle) |
Een GCHandle wordt opgeslagen met behulp van een interne gehele getalweergave. |
| Inequality(GCHandle, GCHandle) |
Retourneert een waarde die aangeeft of twee GCHandle objecten niet gelijk zijn. |