c# – 固定.NET对象数组

c# – 固定.NET对象数组,第1张

概述我想固定.NET对象(包括对象)的数组,以允许本机函数对对象进行一些处理.据我所知,GCHandle.Alloc()不允许我这样做,因为这样的数组包含引用(并且对象也可能包含引用),这些引用不是blittable. 有没有其他选择来实现这一目标?对于非常黑客的建议或需要Mono的建议我会没事的. .NET中的数组表示在连续的内存中.这意味着在内存中,在元素0之后,元素1将直接位于前一个元素之后,依 我想固定.NET对象(包括对象)的数组,以允许本机函数对对象进行一些处理.据我所知,GCHandle.Alloc()不允许我这样做,因为这样的数组包含引用(并且对象也可能包含引用),这些引用不是blittable.

有没有其他选择来实现这一目标?对于非常黑客的建议或需要Mono的建议我会没事的.

解决方法 .NET中的数组表示在连续的内存中.这意味着在内存中,在元素0之后,元素1将直接位于前一个元素之后,依此类推.

如果你用GCHandle.Alloc固定数组,那么这意味着整个元素列表也固定在内存中,你可以在非托管代码中处理它.

但是,正如您所提到的,只有类型是blittable类型才有意义(从技术上讲,这不是真的,如果类型能够被编组为非托管代码,尽管blittable之间存在很多重叠P / Invoke / COM Interop层自动处理的主要类型和内容.

因此,如果您有一个值类型数组,您可以调用GCHandle.Alloc,它将为您固定数组.但是,P / Invoke层已经为你做了这个,所以你不应该关心这个.

如果你的数组中有很多引用,那么将它编组为unamanged代码无论如何都没有意义;即使您固定每个引用,非托管代码也不知道如何处理内存中的引用,因为类型系统不支持引用在内存中指向的.NET类型.

如果.NET中的类实际上是本机结构的包装/ .NET表示,那么最好在.NET中创建该结构的数组,将所有数据复制到其中,然后将其发送到本机代码.

或者,您可以在C / cli中编写类,以便于在本机代码中访问.NET成员.

总结

以上是内存溢出为你收集整理的c# – 固定.NET对象数组全部内容,希望文章能够帮你解决c# – 固定.NET对象数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1262959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存