使用C ++ / CLI Wrapper从C#调用C ++库

时间:2012-12-27 17:19:13

标签: c# c++-cli

我有一个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#数组的内存,我想它们之后是正确的垃圾收集,但只是想确定。

1 个答案:

答案 0 :(得分:2)

就我个人而言,我认为你过于复杂。我会避免使用不安全的代码并跳过C ++ / CLI层。我使用一个简单的p / invoke声明如下:

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

由于doubleint是blittable类型,因此无需复制。编组员只是在调用期间将数组固定。