#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` 方法: ``` cs using System; using System.Runtime.InteropServices; class Program { static void Main() { // 假设这里有一个非托管指针,它指向一个由托管代码创建并固定的对象 IntPtr unmanagedPointer = /* 获取非托管指针 */; // 从非托管指针创建 GCHandle GCHandle gch = GCHandle.FromIntPtr(unmanagedPointer); // 现在你可以在托管代码中操作这个对象了 // ... // 当你不再需要这个 GCHandle 时,记得释放它 gch.Free(); } } ``` 请注意,上面的代码示例中省略了实际获取非托管指针的部分,因为这通常涉及到与非托管代码的交互,具体方式取决于你的应用程序和所使用的非托管库或API。