GCHandle 结构
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供用于从非托管内存访问托管对象的方法。
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)
- 继承
- 属性
- 实现
下面的示例演示了一个 App
类,该类使用 GCHandle.Alloc
方法创建托管对象的句柄,该方法阻止收集托管对象。 对 方法的 EnumWindows
调用传递委托和托管对象 (声明为托管类型,但不) 显示,并将句柄 IntPtr强制转换为 。 非托管函数将类型作为回调函数的参数传递回调用方。
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
结构 GCHandle 与 枚举一起使用, GCHandleType 以创建对应于任何托管对象的句柄。 此句柄可以是以下四种类型之一: Weak
、 WeakTrackResurrection
、 Normal
或 Pinned
。 分配句柄后,可以使用它防止在非托管客户端保留唯一引用时由垃圾回收器收集托管对象。 如果没有此类句柄,垃圾回收器可以在代表非托管客户端完成其工作之前回收对象。
还可以使用 GCHandle 创建可返回内存地址的固定对象,以防止垃圾回收器在内存中移动对象。
当句柄超出范围时,必须通过调用 Free 方法显式释放它;否则,可能会发生内存泄漏。 释放固定句柄时,如果不存在对关联的对象的其他引用,则关联的对象将被取消固定,并且将有资格进行垃圾回收。
Is |
获取一个值,该值指示是否分配了句柄。 |
Target |
获取或设置该句柄表示的对象。 |
Addr |
在 Pinned 句柄中检索对象数据的地址。 |
Alloc(Object) |
为指定的对象分配 Normal 句柄。 |
Alloc(Object, GCHandle |
为指定的对象分配指定类型的句柄。 |
Equals(GCHandle) |
指示当前实例是否等于同一类型的另一个实例。 |
Equals(Object) | |
Free() |
释放 GCHandle。 |
From |
返回从某个托管对象的句柄创建的新 GCHandle 对象。 |
Get |
返回当前 GCHandle 对象的标识符。 |
To |
返回 GCHandle 对象的内部整数表示形式。 |
Equality(GCHandle, GCHandle) |
返回一个值,该值指示两个 GCHandle 对象是否相等。 |
Explicit(GCHandle to Int |
GCHandle 以内部整数表示形式存储。 |
Explicit(Int |
GCHandle 以内部整数表示形式存储。 |
Inequality(GCHandle, GCHandle) |
返回一个值,该值指示两个 GCHandle 对象是否不相等。 |
产品 | 版本 |
---|---|
.NET | Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9 |
.NET Framework | 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1 |
.NET Standard | 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1 |
UWP | 10.0 |