GCHandle Struktúra
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Lehetővé teszi a felügyelt objektumok nem felügyelt memóriából való elérését.
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)
- Öröklődés
- Attribútumok
- Megvalósítás
Példák
Az alábbi példa egy App olyan osztályt mutat be, amely a metódus használatával GCHandle.Alloc létrehoz egy leírót egy felügyelt objektumhoz, amely megakadályozza a felügyelt objektum gyűjtését. A metódus hívása EnumWindows átad egy delegáltat és egy felügyelt objektumot (mindkettő felügyelt típusként van deklarálva, de nem jelenik meg), és a leírót egy IntPtr. A nem felügyelt függvény visszaadja a típust a hívónak a visszahívási függvény paramétereként.
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
Megjegyzések
A GCHandle struktúra az GCHandleType enumerálással egy felügyelt objektumnak megfelelő leíró létrehozásához használható. Ez a fogópont a következő négy típus egyike lehet: Weak, WeakTrackResurrection, Normalvagy Pinned. A leíró lefoglalása után megakadályozhatja, hogy a felügyelt objektumot a szemétgyűjtő összegyűjtse, ha egy nem felügyelt ügyfél rendelkezik az egyetlen hivatkozással. Ilyen leíró nélkül az objektumot összegyűjtheti a szemétgyűjtő, mielőtt befejezné a munkát a nem felügyelt ügyfél nevében.
Olyan rögzített objektumot is GCHandle létrehozhat, amely memóriacímet ad vissza, hogy megakadályozza, hogy a szemétgyűjtő áthelyezze az objektumot a memóriába.
Ha a leíró kiesik a hatókörből, a metódus meghívásával Free explicit módon fel kell szabadítania; ellenkező esetben memóriavesztés léphet fel. Rögzített fogópont felszabadításakor a társított objektum nem lesz rögzítve, és jogosulttá válik a szemétgyűjtésre, ha nincs más hivatkozás rá.
Tulajdonságok
| Name | Description |
|---|---|
| IsAllocated |
Lekérdez egy értéket, amely jelzi, hogy a leíró lefoglalva van-e. |
| Target |
Lekéri vagy beállítja a leíró által képviselt objektumot. |
Metódusok
| Name | Description |
|---|---|
| AddrOfPinnedObject() |
Lekéri az objektumadatok címét egy Pinned leíróban. |
| Alloc(Object, GCHandleType) |
A megadott típusú leírót foglalja le a megadott objektumhoz. |
| Alloc(Object) |
Lekért egy Normal leírót a megadott objektumhoz. |
| Equals(GCHandle) |
Azt jelzi, hogy az aktuális példány egyenlő-e egy másik, azonos típusú példánysal. |
| Equals(Object) |
Meghatározza, hogy a megadott GCHandle objektum egyenlő-e az aktuális GCHandle objektummal. |
| Free() |
Felszabadítja a GCHandle. |
| FromIntPtr(IntPtr) |
Egy leíróból létrehozott új GCHandle objektumot ad vissza egy felügyelt objektumnak. |
| GetHashCode() |
Az aktuális GCHandle objektum azonosítóját adja vissza. |
| ToIntPtr(GCHandle) |
Egy objektum belső egész számának ábrázolását GCHandle adja vissza. |
Operátorok
| Name | Description |
|---|---|
| Equality(GCHandle, GCHandle) |
Egy értéket ad vissza, amely jelzi, hogy két GCHandle objektum egyenlő-e. |
| Explicit(GCHandle to IntPtr) |
Az A-t GCHandle belső egész számábrázolással tárolja a rendszer. |
| Explicit(IntPtr to GCHandle) |
Az A-t GCHandle belső egész számábrázolással tárolja a rendszer. |
| Inequality(GCHandle, GCHandle) |
Egy értéket ad vissza, amely jelzi, hogy két GCHandle objektum nem egyenlő-e. |