下午好,
我一直在通过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指针之间有很大的区别吗?是否有我失踪的角落案件?
感谢您的见解,
Giawa
答案 0 :(得分:4)
后者很好。 P / Invoke层将在CreateArray
执行时将托管阵列固定在内存中,并且此方法不需要编组,因为UInt32[]
是blittable type。因此,这与使用指针一样快。
使用前一个声明,您必须将内存复制到适当的托管数组中,除非您要完全通过指针对输出进行操作。而这种复制会更昂贵。因此,换句话说,如果您试图从调用中获取正确的托管数组,则使用后一种语法将表现更好,并且不需要手动数据提取。