使用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[] ma
和double[] 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);
因为double
和int
是blittable类型,所以不需要复制。 编组人员只需在通话期间固定阵列。
上一篇: Calling C++ Library from C# with C++/CLI Wrapper
下一篇: How can I use a 'native' pointer in a reference class in C++/CLI?