C# 编码(marshal) uint*& 参数

标签 c# .net pointers marshalling

我正在浏览整个 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/

相关文章:

c# - ObjectListView - 过滤的行数

c# - 将接口(interface)传递给 Startup.cs ConfigureServices 中的另一个服务

c++ - 将类回调函数分配给结构?

c - C 中的线程 1 : EXC_BAD_ACCESS (code=1, 地址=0x0)

c# - 将自定义类型用于参数化 MSTest

c# - wcf:调试 native c++ dll?

c# - 在 Windows 上用 C# 加载 linux 动态库 (.so)

c - ssh 中不兼容指针类型的赋值

c# - 列 ID 在规范中出现多次?

c# - 人们在使用 Rhino Mocks 的 ASP.NET MVC 中将哪些资源用于 TDD?