GCHandle.ToIntPtr.md 1.6 KB

#unity/日常积累

GCHandle.ToIntPtr 方法在 C# 中用于获取一个表示 GCHandle 实例的 IntPtr。这个 IntPtr 可以被传递给需要对象指针的非托管代码。当你使用 GCHandle.Alloc 方法分配了一个句柄,并且想要将这个句柄传递给非托管代码时,ToIntPtr 方法就显得非常有用。

以下是一个使用 GCHandle.ToIntPtr 方法的示例:

using System;
using System.Runtime.InteropServices;

class Program
{
    // 假设这是一个非托管方法,它需要一个对象的指针
    [DllImport("SomeUnmanagedLibrary.dll")]
    private static extern void UnmanagedMethod(IntPtr objPtr);

    static void Main()
    {
        object obj = new object();
        GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);

        try
        {
            // 获取表示 GCHandle 的 IntPtr,并将其传递给非托管方法
            IntPtr objPtr = handle.ToIntPtr();
            UnmanagedMethod(objPtr);
        }
        finally
        {
            // 确保在使用完 handle 后释放它
            handle.Free();
        }
    }
}

在这个示例中,我们首先分配了一个固定(pinned)的 GCHandle,然后使用 ToIntPtr 方法获取了一个表示这个句柄的 IntPtr。接着,我们将这个 IntPtr 传递给了一个非托管方法。最后,在 finally 块中,我们释放了句柄以避免内存泄漏。

其中一个用法,是跨语言和平台交互,例如要把一个方法,传递给objectc,可以配合[[GCHandle.Alloc]]]使用

![[Pasted image 20241025144012.png]]