【问题标题】:C# Marshal uint*& parameterC# Marshal uint*& 参数
【发布时间】:2011-11-03 08:19:19
【问题描述】:

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

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

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

我将以下参数编组:

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

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

另一个想法是:是否可以使用相同的方式编组 int* 和 int& 参数

ref UInt32

?还是我需要在没有“ref”关键字的情况下使用 UIntPtr / IntPtr? 在这种情况下,我宁愿使用 ref 而不是 out 以避免 C++ 使用未初始化的 int 引用。

【问题讨论】:

    标签: c# .net pointers marshalling


    【解决方案1】:

    您的 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++ 方法参数通过宏包装。这意味着此处所述的 uint 声明为 unsigned long 并且第三个参数在内部声明为 unsigned __int64,考虑到这些信息,您认为我声明的类型更适合比你的?
    • 好吧,我只能回答问题中的内容! ;-) 但是如果他们的 C++ 声明如您所说,那么在 C# 中,参数 1 是 uintUInt32,参数 2 是 ulongUInt64
    • 当然可以 :) 但我想在第一步中保留宏问题 :)
    • 我不这么认为。我认为这是为了在另一个方向传递值,管理到非管理。 IntPtr 很好。
    • 有人说使用 ref 和/或 out 将输出参数传递给 C++ DLL 之间存在重大差异。根据这个家伙的说法,传递指针会导致这样一个事实,即只有指针自身的内存单元会被传递,而不是指针指向的内存,因此应该使用“ref”关键字传递指针、字符串和整数确保该值不仅会传递给指向/引用它的内存单元。你对此了解多少?
    猜你喜欢
    • 2010-12-16
    • 2018-02-13
    • 2012-01-06
    • 1970-01-01
    • 2018-07-27
    • 2020-12-08
    • 1970-01-01
    • 2012-06-29
    • 2011-05-05
    相关资源
    最近更新 更多