C#Marshal uint *&参数

时间:2011-11-03 08:19:19

标签: c# .net pointers marshalling

我正在浏览整个stackoverflow论坛,但我不确定我的编组解决方案是否适合我的问题。

我有一个c ++方法通过参数返回一个整数数组。原型如下:

method1(uint aId, uint*& aNewIntArray, uint& aNewIntArrayCount);

我编组参数如:

method1(UInt32 aId, ref UIntPtr aNewIntArray, ref UInt64 aNewIntArrayCount);

我编组uint *&引用UIntPtr,但我不确定这是否正确,虽然我没有找到另一个有同样问题的人,我会问自己。

另一个想法是:是否可以编组int *和int&使用

以相同的方式参数
ref UInt32

?或者我是否需要使用没有“ref”关键字的UIntPtr / IntPtr? 在这种情况下,我更喜欢使用 ref 而不是 out 来避免C ++使用未初始化的int引用。

1 个答案:

答案 0 :(得分:2)

您的C ++方法正在分配一个整数数组并返回指向aNewIntArray中第一个元素的指针。因此该参数的匹配C#定义是

ref IntPtr aNewIntArray

您使用的UIntPtr基本相同。我认为你的印象是UIntPtr是你使用的,如果底层数组是无符号的,但事实并非如此。这实际上是一个void*指针,您必须使用Marshal.Copy转移到C#数组uint[]

请注意,由于aNewIntArray确实是一个out参数,我认为您应该将其声明为

您还错误地声明了最终参数。它是一个32位整数。

因此我会声明C#函数:

method1(uint aId, out IntPtr aNewIntArray, out uint aNewIntArrayCount);