大家下午好,
我一直致力于通过InteropServices.DllImport访问一些外部DLL。我最初选择了一些不安全的代码,如下所示:
internal extern static unsafe void CreateArray(Int32 size, [OutAttribute] UInt32* array);但是,我认为可以通过传递UInt32数组而不是指针来将这种不安全的代码替换为纯粹的安全代码。代码将更改为
internal extern static void CreateArray(Int32 size, [OutAttribute] UInt32[] array);这似乎没有任何问题的工作。然而,我在谨慎方面犯了错误。有没有可能GC现在出现了并造成问题?传递数组和传递UInt32指针有很大区别吗?有没有我漏掉的角落里的箱子?
感谢你的洞察,
吉瓦瓦
发布于 2010-12-10 14:16:46
后者很好。P/Invoke层将在CreateArray执行时将托管数组固定在内存中,这种方法不需要封送处理,因为UInt32[]是一个blittable type。因此,这将与使用指针一样快。
使用前一个声明,除非您打算完全通过指针对输出进行操作,否则必须将内存复制到适当的托管数组中。而且这种复制会更昂贵。因此,换句话说,如果您试图从调用中获得一个适当的托管数组,使用后一种语法将会执行得更好,并且不需要手动提取数据。
https://stackoverflow.com/questions/4406214
复制相似问题