1

我有一个 C++ 库,其标题如下所示:

void NotMyFun(double * a, int * b);

该函数从 读取a并写入b。为了调用该库,我创建了一个 C++/CLI 包装器,其中定义了以下函数:

static void MyWrapperFun(double * a, int * b)
{
    NotMyFun(a,b);
}

并且工作正常。例如,从 C# 代码中,我有两个托管数组,即double[] madouble[] mb​​ ,其中ma已经保存了一些有意义的数据,并且mb在调用包装器时被 - 有意义地 - 填充。下面是调用包装函数的好方法吗?

unsafe
{
    fixed (double* pma = ma)
    {
        fixed (int* pmb = mb)
        {
            MyWrapperNS.MyWrapperClass.MyWrapperFun(pma,pmb);
        }
    }
}

不安全的指针是一种快速的方法吗?在向/从 C++/CLI 包装器传递和检索时,是否涉及任何数据复制?或者指针已经指向 C# 数组中的连续内存空间?

此外,我需要在这里手动清理内存吗?如果指针与托管 C# 数组的内存相关联,我猜想它们之后会被正确地垃圾收集,但只是想确定一下。

4

1 回答 1

2

我个人认为你把事情复杂化了。我会避免使用不安全的代码并跳过 C++/CLI 层。我会使用一个简单的 p/invoke 声明如下:

[DllImport(@"mylib.dll")]
static extern void NotMyFun(double[] a, int[] b);

因为doubleandint是 blittable 类型,所以不需要复制。编组器只是在调用期间固定数组。

于 2012-12-27T17:51:52.123 回答