是否可以在 C# 中创建固定指针?

Is it possible to create pinned pointer in C#?

是否可以像 C++/CLI 中的 pin_ptr 一样在 C# 中创建固定指针?

一般解法:

GCHandle handle = GCHandle.Alloc(myObject, GCHandleType.Pinned);
try
{
    IntPtr myPinnedPointer = handle.AddrOfPinnedObject();
    // use myPinnedPointer for your needs
}
finally
{
    handle.Free();
}

特例:

如果您的对象是结构数组或字符串,您可以在项目中使用不安全代码,您可以使用fixed上下文:

unsafe
{
    fixed (char* myPinnedPointer = myString)
    {
        // use myPinnedPointer for your needs
    }
}

虽然在 C# 中有 fixed 关键字,并且您可以使用 System.GCHandle 结构,但没有任何东西具有 pin_ptr<> 的 "power"。使用 pin_ptr<> 可以固定任何托管对象,而使用 fixed 则只能固定 string 或不包含引用类型的值类型数组。因此,您可以固定 int[]MyEnum[]MyStructWithoutReferenceTypes[],但不能固定 MyClassTypeMyClassType[]