GCHandle.Alloc 方法 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
为指定的对象分配句柄。
重载
| Alloc(Object) | 为指定的对象分配 Normal 句柄。 | 
| Alloc(Object, GCHandleType) | 为指定的对象分配指定类型的句柄。 | 
Alloc(Object)
- 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.GCHandlestatic member Alloc : obj -> System.Runtime.InteropServices.GCHandlePublic Shared Function Alloc (value As Object) As 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
为指定的对象分配指定类型的句柄。
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.GCHandlestatic member Alloc : obj * System.Runtime.InteropServices.GCHandleType -> System.Runtime.InteropServices.GCHandlePublic Shared Function Alloc (value As Object, type As GCHandleType) As GCHandle参数
- type
- GCHandleType
GCHandleType 值之一,指示要创建的 GCHandle 的类型。
返回
指定的类型的新 GCHandle。 当不再需要 GCHandle 时,必须通过 Free() 将其释放。
- 属性
例外
具有非基元(非直接复制到本机结构中的)成员的实例不能被固定。