我正在浏览整个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引用。
答案 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);