2.3 KiB
2.3 KiB
#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。