【发布时间】: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参数的限制或返回,据我所知,答案你的问题是“还没有”。就个人而言,如果他们将来确实允许这样做,我会感到惊讶,因为它会有效地消除访问的不安全性质。