GCHandle.Alloc 方法

定义

为指定对象分配句柄。

重载

名称 说明
Alloc(Object)

为指定对象分配句 Normal 柄。

Alloc(Object, GCHandleType)

为指定对象分配指定类型的句柄。

Alloc(Object)

Source:
GCHandle.cs
Source:
GCHandle.cs
Source:
GCHandle.cs
Source:
GCHandle.cs
Source:
GCHandle.cs

为指定对象分配句 Normal 柄。

public:
 static System::Runtime::InteropServices::GCHandle Alloc(System::Object ^ value);
[System.Security.SecurityCritical]
public static System.Runtime.InteropServices.GCHandle Alloc(object value);
public static System.Runtime.InteropServices.GCHandle Alloc(object? value);
public static System.Runtime.InteropServices.GCHandle Alloc(object value);
[<System.Security.SecurityCritical>]
static member Alloc : obj -> System.Runtime.InteropServices.GCHandle
static member Alloc : obj -> System.Runtime.InteropServices.GCHandle
Public Shared Function Alloc (value As Object) As GCHandle

参数

value
Object

使用 GCHandle.. 的对象

返回

保护对象免受垃圾回收的新增 GCHandle 功能。 当 GCHandle 不再需要此功能时,必须释放 Free() 它。

属性

示例

下面的示例演示了一个 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

注解

Normal 句柄不透明,这意味着无法解析它通过句柄包含的对象地址。

另请参阅

适用于

Alloc(Object, GCHandleType)

Source:
GCHandle.cs
Source:
GCHandle.cs
Source:
GCHandle.cs
Source:
GCHandle.cs
Source:
GCHandle.cs

为指定对象分配指定类型的句柄。

public:
 static System::Runtime::InteropServices::GCHandle Alloc(System::Object ^ value, System::Runtime::InteropServices::GCHandleType type);
[System.Security.SecurityCritical]
public static System.Runtime.InteropServices.GCHandle Alloc(object value, System.Runtime.InteropServices.GCHandleType type);
public static System.Runtime.InteropServices.GCHandle Alloc(object? value, System.Runtime.InteropServices.GCHandleType type);
public static System.Runtime.InteropServices.GCHandle Alloc(object value, System.Runtime.InteropServices.GCHandleType type);
[<System.Security.SecurityCritical>]
static member Alloc : obj * System.Runtime.InteropServices.GCHandleType -> System.Runtime.InteropServices.GCHandle
static member Alloc : obj * System.Runtime.InteropServices.GCHandleType -> System.Runtime.InteropServices.GCHandle
Public Shared Function Alloc (value As Object, type As GCHandleType) As GCHandle

参数

value
Object

使用 GCHandle.. 的对象

type
GCHandleType

值之 GCHandleType 一,指示要创建的类型 GCHandle

返回

指定类型的新 GCHandle 类型。 当 GCHandle 不再需要此功能时,必须释放 Free() 它。

属性

例外

无法固定具有非特权(非 blittable)成员的实例。

另请参阅

适用于