编程语言
首页 > 编程语言> > 如何使用st#:: vector作为C#参数调用非托管C函数?

如何使用st#:: vector作为C#参数调用非托管C函数?

作者:互联网

出于性能原因,我有一个C#前端和一个C后端.
现在我想调用一个C函数,例如:

void findNeighbors(Point p, std::vector<Point> &neighbors, double maxDist);

我想要的是一个C#包装函数,如:

List<Point> FindNeigbors(Point p, double maxDist);

我可以将像Point []这样的平面数组传递给非托管C dll,但问题是,我不知道要分配多少内存,因为我不知道函数将返回的元素数量…

是否有一种优雅的方式来处理这个没有内存泄漏的麻烦?

谢谢你的帮助!

本杰明

解决方法:

这里最好的解决方案是在C中编写一个包装函数,该函数仅限于非C类.通过PInvoke层[1],非平凡的C类基本上是不可复制的.相反,包装函数使用更传统的C签名,这很容易被PInvoke反对

void findNeigborsWrapper(
  Point p,
  double maxDist, 
  Point** ppNeighbors,
  size_t* pNeighborsLength)

[1]是的,在某些情况下,你可以逃脱它,但这是例外,而不是规则.

标签:c,stdvector,unmanaged,c-2
来源: https://codeday.me/bug/20190929/1833014.html