将2D双数组从C#传递给C ++函数

时间:2018-02-18 02:15:48

标签: c# c++ arrays

我在c ++的Managed类中有一个函数。我们称这个函数为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 个答案:

答案 0 :(得分:0)

用于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);
    }
}