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

2.3 KiB
Raw Permalink Blame History

#unity/日常积累

GCHandle.FromIntPtr 是 .NET 中 System.Runtime.InteropServices.GCHandle 类的一个静态方法。这个方法用于从一个非托管的指针(IntPtr)创建一个新的 GCHandle 实例,该实例代表了一个已经存在的、由非托管代码管理的对象。

在.NET中GCHandle 是用于管理托管和非托管代码之间的对象引用的。它允许你固定对象在内存中的位置防止其被垃圾回收GC或者获取一个指向对象的非托管指针。

GCHandle.FromIntPtr 的使用场景通常是在与非托管代码交互时,你已经获得了一个指向某个对象的非托管指针,并且需要在托管代码中操作这个对象。通过这个方法,你可以将这个非托管指针转换为一个 GCHandle,进而在托管代码中安全地访问和操作这个对象。

需要注意的是,使用 GCHandle.FromIntPtr 时,你必须确保所传入的 IntPtr 确实是一个有效的、由 GCHandle.ToIntPtr 方法返回的指针,或者是由非托管代码以某种方式提供给你的、指向一个由托管代码创建并固定的对象的指针。否则,尝试从这个指针创建一个 GCHandle 可能会导致未定义的行为或程序崩溃。

另外,由于 GCHandle 是非托管资源,因此在使用完毕后,你应该适时地调用 GCHandle.Free 方法来释放它,以避免内存泄漏。

以下是一个简单的示例,展示了如何使用 GCHandle.FromIntPtr 方法:

using System;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        // 假设这里有一个非托管指针,它指向一个由托管代码创建并固定的对象
        IntPtr unmanagedPointer = /* 获取非托管指针 */;

        // 从非托管指针创建 GCHandle
        GCHandle gch = GCHandle.FromIntPtr(unmanagedPointer);

        // 现在你可以在托管代码中操作这个对象了
        // ...

        // 当你不再需要这个 GCHandle 时,记得释放它
        gch.Free();
    }
}

请注意上面的代码示例中省略了实际获取非托管指针的部分因为这通常涉及到与非托管代码的交互具体方式取决于你的应用程序和所使用的非托管库或API。