UInt32 []与UInt32 *

时间:2010-12-10 06:15:04

标签: c# dllimport

下午好,

我一直在通过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

1 个答案:

答案 0 :(得分:4)

后者很好。 P / Invoke层将在CreateArray执行时将托管阵列固定在内存中,并且此方法不需要编组,因为UInt32[]blittable type。因此,这与使用指针一样快。

使用前一个声明,您必须将内存复制到适当的托管数组中,除非您要完全通过指针对输出进行操作。而这种复制会更昂贵。因此,换句话说,如果您试图从调用中获取正确的托管数组,则使用后一种语法将表现更好,并且不需要手动数据提取。