obsidian/笔记文件/2.笔记/GCHandle.ToIntPtr.md
2025-03-26 00:02:56 +08:00

1.6 KiB
Raw Permalink Blame History

#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