将二维双数组从 C# 传递到 C++ 函数

Posted

技术标签:

【中文标题】将二维双数组从 C# 传递到 C++ 函数【英文标题】:Passing 2D double array from C# to C++ function 【发布时间】:2018-07-28 14:32:46 【问题描述】:

我在 C++ 的托管类中有一个函数。我们称这个函数为 CopyDoubles。此函数仅接收两个数组作为参数。

double ManagedClass::CopyDoubles(double acopy[][3], double bcopy[][3])
    //code

从 C# 中,我可以访问此函数,但是,我无法正确传递参数。我试过了。

double [,] a = new double[128,3];
double [,] b = new double[128,3];

double result = Managed.CopyDoubles(a,b);

但它不起作用。我错过了什么?该函数不会将 a 和 b 作为参数。

【问题讨论】:

【参考方案1】:

用于 C++ 函数的类名 Managed 让我感到困惑。也许你的意思是 C++/CLI?

您应该为您的数组分配普通句柄。然后,您可以获得指向您的数组的稳定指针,您可以将其传递给您的 C++ 方法。固定一个对象可以防止垃圾收集器在内存中移动它。

GCHandle pinnedA = GCHandle.Alloc(a, GCHandleType.Pinned);
GCHandle pinnedB = GCHandle.Alloc(b, GCHandleType.Pinned);
IntPtr pointerA = pinnedA.AddrOfPinnedObject();  
IntPtr pointerB = pinnedA.AddrOfPinnedObject();

double result = Managed.CopyDoubles(pointerA, pointerB);

pinnedA.Free();
pinnedB.Free();

如果允许在项目中使用不安全代码,则可以使用固定上下文:

unsafe

    fixed (double* pA = a) fixed (double* pB = b)
    
         double result = Managed.CopyDoubles(pA, pB);
    

【讨论】:

以上是关于将二维双数组从 C# 传递到 C++ 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将二维数组从 C# 传递到 C++?

使用 C++/CLI 包装器将二维数组从 C# 传递到非托管 C++

如何将 C# 中的二维数组传递给 C++ DLL?

无法将二维数组传递给 C++ 中的辅助函数

如何将结构数组从 c++ 传递到 c#?

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?