【问题标题】:Is there any way to convert IntPtr / void* to ref SomeStruct in C#?有没有办法在 C# 中将 IntPtr / void* 转换为 ref SomeStruct?
【发布时间】:2017-10-07 03:56:12
【问题描述】:

主题。用例是:假设我有一个非托管缓冲区,它存储了 N 个 SomeStruct 实例。所以在这个缓冲区中有一个地址,有没有办法把这个地址转换为ref SomeStruct——例如能够直接更新这些结构吗?

附:我知道即将到来的Span<T> 类型。我很好奇现在是否有任何方法可以在 C# 中做类似的事情。

【问题讨论】:

  • 是的,通过不安全的代码和编组,但这不是我经常做的足以给你更多的东西。
  • 你能用 c/c++ 做吗?是来自另一个进程还是同一个进程的地址?
  • 您在寻找Marshal.PtrToStructure吗?
  • unsafe 上下文中并假设结构不包含引用,您可以将指向缓冲区第一个元素的指针强制转换为 SomeStruct*(支持指针算法以访问其他元素)并可以访问通过 C# 的 -> operator 字段,就像在 C 或 C++ 中一样。这将直接修改内存(尽管是以不安全的方式)。
  • @AlexYakunin afaik,C# 不支持将不安全的指针转换为ref,因此,如果您受到使用ref 参数的限制或返回,据我所知,答案你的问题是“还没有”。就个人而言,如果他们将来确实允许这样做,我会感到惊讶,因为它会有效地消除访问的不安全性质。

标签: c# pointers ref


【解决方案1】:

好的,找到答案了:System.Runtime.CompilerServices.Unsafe.AsRef<T> 解决了问题。更多信息:http://adamsitnik.com/ref-returns-and-ref-locals/

【讨论】:

  • 它可能也必须是 blittable。
  • 如果 CLR 可以有一些将其映射到数组的概念(也称为 C 指针,但类型安全,但我猜 Span 是答案),那就太好了。
  • 是的,Span<T> 是答案,但还没有:) 我一直在寻找类似的方法,但没有Span<T>,看起来就是这样做的方法:您可以在不安全的代码中获取指向数组元素的指针,这就是如何将其转换为安全的引用返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2021-10-10
  • 2021-11-18
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多