我有一个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
已经包含一些有意义的数据,并且mb
在包装时正在填充叫做。下面是一个调用包装函数的好方法吗?
unsafe
{
fixed (double* pma = ma)
{
fixed (int* pmb = mb)
{
MyWrapperNS.MyWrapperClass.MyWrapperFun(pma,pmb);
}
}
}
不安全的指针是否快速?在向/从C ++ / CLI包装器传递和检索时,是否涉及任何数据复制?或指针已指向C#数组中的连续内存空间?
此外,我需要在这里进行任何手动内存清理吗?如果指针绑定到托管C#数组的内存,我想它们之后是正确的垃圾收集,但只是想确定。
答案 0 :(得分:2)
就我个人而言,我认为你过于复杂。我会避免使用不安全的代码并跳过C ++ / CLI层。我使用一个简单的p / invoke声明如下:
[DllImport(@"mylib.dll")]
static extern void NotMyFun(double[] a, int[] b);
由于double
和int
是blittable类型,因此无需复制。编组员只是在调用期间将数组固定。