换句话说,在将struct指针传递给非托管代码之后,非托管代码复制指针并立即返回.非托管代码可以在另一个线程的后台访问该结构体.我无法控制在另一个线程中运行的非托管代码,也不能控制线程本身.
固定的{}语句不能用于固定,因为它不是为异步非托管固定而设计的.
GCHandle只能引用引用,所以结构体必须装箱使用GCHandle.我试过,它的作品.它的主要问题是您无法从托管代码更新结构.要更新一个结构,首先我们需要unBox它,然后更新,然后再次框,但… oops …框再次?这意味着内存中的前一个指针仍然指向旧的非最新的结构体,新的结构体有另一个指针,这意味着我需要将新的指针传给非托管代码…不适用于我的案件.
如何在内存中固定一个结构体,而不需要固定的{}语句,所以我可以从托管代码更新它,而不改变它的指针?
谢谢.
编辑:
只是想…有一种方法来固定包含结构体的父对象,然后获取结构体的指针而不是容器对象?
解决方法 不安全的代码是一个选项吗?// allocate unmanaged memoryFoo* foo = (Foo*)Marshal.AllocHGlobal(sizeof(Foo));// initialize structfoo->bar = 0;// invoke unmanaged function which remembers fooUnsafeNativeMethods.bar(foo);Console.Writeline(foo->bar);// update structfoo->bar = 10;// invoke unmanaged function which uses remembered fooUnsafeNativeMethods.Qux();Console.Writeline(foo->bar);// free unmanaged memoryMarshal.FreeHGlobal((IntPtr)foo);
这个编译并没有抛出异常,但我手头没有非托管功能来测试它是否工作.
从MSDN:
总结When AllocHGlobal calls LocalAlloc,it passes a LMEM_FIXED flag,which causes the allocated memory to be locked in place. Also,the allocated memory is not zero-filled.
以上是内存溢出为你收集整理的c# – 在传递给非托管代码之前固定一个更新结构体?全部内容,希望文章能够帮你解决c# – 在传递给非托管代码之前固定一个更新结构体?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)