gpt4 book ai didi

c# - Unsafe.AsPointer(ref T value) 是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-03 22:42:21 27 4
gpt4 key购买 nike

在 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# 代码,可能一开始就不是用 C# 编写的。您看到的是 ILSpy 的底层代码的 C# 表示 - C# 语法能够表示这一点,因为它只是一个编译器规则,表明您无法获得指向托管类型的指针。

我的猜测(我不知道这是一个事实),有问题的代码首先是用 IL 编写的——如果你将它反编译为 IL,你会发现它是一个微不足道的部分:

.method public hidebysig static 
void* AsPointer<T> (
!!T& 'value'
) cil managed flag(0100)
{
.custom instance void
System.Runtime.Versioning.NonVersionableAttribute::.ctor() = (
01 00 00 00
)
// Method begins at RVA 0x2190
// Code size 3 (0x3)
.maxstack 1

IL_0000: ldarg.0
IL_0001: conv.u
IL_0002: ret
} // end of method Unsafe::AsPointer

(这是来自 System.Runtime.CompilerServices.Unsafe.dll。)

托管实例被加载到堆栈上,然后作为无符号指针值简单地返回。

如果您想重新创建此行为,您可以 - 只需在 IL 中编写您的 DLL 并编译它,然后从任何其他支持指针的 .NET 语言引用它。

关于c# - Unsafe.AsPointer<T>(ref T value) 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51599375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com