c++ cli -使用c++ / cli包装器从c#调用c++库

本文关键字:c++ cli 调用 包装 使用 | 更新日期: 2023-09-27 17:49:36

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

c++ cli -使用c++ / cli包装器从c#调用c++库

我个人认为你把事情弄得太复杂了。我会避免使用不安全的代码,并跳过c++/CLI层。我将使用像这样声明的简单p/调用:

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

因为doubleint是位元类型,所以不需要复制。编组程序只是在调用期间固定数组。