是否可以在 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[]
,但不能固定 MyClassType
或 MyClassType[]
。
是否可以像 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[]
,但不能固定 MyClassType
或 MyClassType[]
。