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[] ma
和double[] mb
,其中ma
已经保存了一些有意义的数据,mb
在调用包装器时被有意义地填充。下面是调用包装器函数的好方法吗?
unsafe
{
fixed (double* pma = ma)
{
fixed (int* pmb = mb)
{
MyWrapperNS.MyWrapperClass.MyWrapperFun(pma,pmb);
}
}
}
不安全的指针是一种快速的方式吗?在传递和检索到/从c++/CLI包装器时,是否涉及任何数据复制?或者指针已经指向c#数组中的连续内存空间?
另外,我这里需要手动清理内存吗?如果指针被绑定到托管c#数组的内存,我猜它们是正确的垃圾收集之后,但只是想确定。
我个人认为你把事情弄得太复杂了。我会避免使用不安全的代码,并跳过c++/CLI层。我将使用像这样声明的简单p/调用:
[DllImport(@"mylib.dll")]
static extern void NotMyFun(double[] a, int[] b);
因为double
和int
是位元类型,所以不需要复制。编组程序只是在调用期间固定数组。