【发布时间】:2010-12-23 10:58:17
【问题描述】:
我使用一些旧 API,需要将结构的指针传递给异步运行的非托管代码。
换句话说,在我将结构指针传递给非托管代码后,非托管代码复制指针并立即返回。非托管代码可以在后台,在另一个线程中访问该结构。 我无法控制在另一个线程中运行的非托管代码,也无法控制线程本身。
固定的 { } 语句不能用于固定,因为它不是为异步非托管固定而设计的。
GCHandle 只能固定引用,因此必须将结构装箱才能使用 GCHandle。我试过了,它有效。它的主要问题是您无法从托管代码更新结构。要更新一个结构,首先我们需要将它拆箱,然后更新,然后再装箱,但是……哎呀……又装箱了?!?这意味着内存中的前一个指针仍然指向旧的非最新结构,而新结构有另一个指针,这意味着我需要将新指针传递给非托管代码......不适用于我的案例。
如何在没有固定 { } 语句的情况下将结构固定在内存中,以便我可以从托管代码更新它而不更改它的指针?
谢谢。
编辑:
只是想...有没有办法固定包含结构的父对象,然后获取 struct 的指针而不是容器对象?
【问题讨论】:
-
我原以为 GCHandle 是这里的解决方案。如果一切都失败了,你可以在非托管代码中分配内存,所以它不会被 GC 移动。
-
好问题。我想我已经在 CLI/C++ 中做到了,我需要查看我的工作笔记。不过,不确定是否有 C# 等效机制。
-
也许在您自己的后台线程中进行调用,使用固定的 {} 并且永远不要离开固定的 {} 块(至少只要非托管代码可以访问该结构)?
-
不,您只需要自己编组数据,而不是让 GC 使用它。
-
@DxCK,您能否澄清一下“如何在没有固定 {} 语句的情况下将结构固定在内存中,以便我可以在不更改指针的情况下更新它?”...它是托管代码,还是您希望在固定时更新内存的非托管代码?
标签: c# .net struct unmanaged pinning