使用C ++ / CLI包装从C#调用C ++库

我有一个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已经包含一些有意义的数据,并且在调用wrapper时, mb被意外填充。 低于一个好方法来调用包装函数?

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

不安全的指针是一种快速的方式吗? 在传递和从C ++ / CLI包装中检索/从C / 或者指针已经指向C#数组中的连续内存空间?

此外,我是否需要在这里进行任何手动记忆清洁? 如果指针与托管C#数组的内存绑定,我想他们在正确的垃圾回收后,但只是想确定。


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

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

因为doubleint是blittable类型,所以不需要复制。 编组人员只需在通话期间固定阵列。

链接地址: http://www.djcxy.com/p/27805.html

上一篇: Calling C++ Library from C# with C++/CLI Wrapper

下一篇: How can I use a 'native' pointer in a reference class in C++/CLI?