调用具有std :: list作为参数的C ++函数

时间:2017-03-10 04:53:24

标签: c# c++ pinvoke clr marshalling

这里我正在编写包装来调用c#project中的c ++函数。这里我没有使用Dllimport方法。我正在寻找C ++ / CLR方法。使用C ++ / CLR方法,我们可以直接将Dll添加到c#项目中。

在我的C ++ / CLR中,我有一个如下的功能。

int StartScan(std::list<SomeObject*> *DeviceList);

我想从C#调用此函数。什么是从C#调用的等价属性。 我尝试使用LinkedList,它是 std :: list 的等效属性,如果我们使用P / Invoke方法。

1 个答案:

答案 0 :(得分:1)

你不能。由于您的问题暗示您正在使用C ++ / CLR并且您可以控制该代码,因此您应该编写C#应该用来将托管List<T>对象作为参数的公共方法,然后复制内容到您的C ++代码显然实际需要的std::list<SomeObject*>对象。

您需要T的托管类型,这相当于您在C ++中使用的SomeObject。您还必须将托管类型中的这些对象也克隆到std:list

如果您无法更改C ++ / CLI代码,那么您必须编写一个填充DLL来处理转换。 P / invoke不知道如何自动执行此操作。


如果您能够按this comment中的建议使用STL / CLR库,即您可以将std::库用户切换到cliext::库,那么它包含的代码可以帮助您。例如,您可以创建cliext::list对象,将托管List<T>传递给其构造函数,然后将托管列表的内容复制到cliext::list对象。

例如:How to: Convert from a .NET Collection to a STL/CLR Container