【问题标题】:Passing 2D double array from C# to C++ function将二维双数组从 C# 传递到 C++ 函数
【发布时间】: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 作为参数。

【问题讨论】:

    标签: c# c++ arrays


    【解决方案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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多