我正在浏览整个 stackoverflow 论坛,但我不确定我的编码解决方案是否适合我的问题。
我得到了一个通过参数返回整数数组的 C++ 方法。原型(prototype)如下:
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 引用。
最佳答案
您的 C++ 方法正在分配一个整数数组并返回指向 aNewIntArray
中第一个元素的指针。因此,该参数的匹配 C# 定义是
ref IntPtr aNewIntArray
您使用的 UIntPtr
基本上是等价的。我认为您的印象是,如果基础数组是无符号的,则 UIntPtr
就是您使用的,但事实并非如此。这实际上是一个 void*
指针,您必须使用 Marshal.Copy
传输到 C# 数组 uint[]
。
请注意,由于 aNewIntArray
确实是一个输出参数,我认为您应该这样声明它
您还错误地声明了最终参数。它是一个 32 位整数。
因此,我会这样声明 C# 函数:
method1(uint aId, out IntPtr aNewIntArray, out uint aNewIntArrayCount);
关于C# 编码(marshal) uint*& 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7991866/