【发布时间】:2018-07-30 17:30:04
【问题描述】:
在 C# 中,您不应该能够创建指向托管类型的指针,但使用此 API,您可以使用 Unsafe.AsPointer<T>。
https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/
我看到了使用 ILSpy 的源代码,我看到了这个:
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[System.Runtime.Versioning.NonVersionable]
public unsafe static void* AsPointer<T>(ref T value)
{
return &value;
}
也在其他类似的API中:
//Unity.Collections.LowLevel.Unsafe.UnsafeUtility
public unsafe static T ReadArrayElement<T>(void* source, int index)
{
return *(T*)((byte*)source + index * sizeof(T));
}
这是如何工作的以及如何复制这种行为?
【问题讨论】:
-
您可以在 C# 中创建和使用指针就好了。您需要做的就是启用不安全代码。很长一段时间以来,这一直是该语言的一部分。
-
是的,但是当我尝试使用任何我收到警告的方法。
-
为什么需要指向托管类型的指针?您只能读取/更改原始类型的字节 - 托管类型只是原始类型的集合。
-
@xxbbcc 我再次认为你(和亲密的选民)没有抓住重点。 OP 不是问它是好是坏,或者如何使用系统提供的方法,他们只是问如何某些系统类可能包含无效的 C# 代码。
-
@IvanStoev 你去。 :)