这里我正在编写包装来调用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方法。
答案 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