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

Posted

技术标签:

【中文标题】调用以 std::list 作为参数的 C++ 函数【英文标题】:call C++ function which is having std::list as parameter 【发布时间】:2017-03-10 04:53:23 【问题描述】:

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

在我的 C++/CLR 中,我有一个函数,如下所示。

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

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

【问题讨论】:

A std::list 是在 C++ 中实现定义的。对于不同的编译器和编译器版本,它的实现方式不同。 C# 不可能将它与 PInvoke 匹配。甚至不同的 C++ 编译器和版本也无法匹配彼此的std::list How to return a list in C# using P/Invoke?的可能重复 也相关:***.com/questions/1579559/… c++/CLI 不会神奇地允许从 c# 访问所有 c/c++ 类型。相反,您应该创建新的或修改现有的 c++ 类型以支持 CLR。​​ 泛型类型参数必须是引用类型或值类型。如果 MyStruct 是 POD,则将其声明为 value struct。这是最简单的解决方法。您可以改为将其设为实现IEquatableiComparableref class,但这会更复杂。见:msdn.microsoft.com/en-us/library/c570k3f3%28v=vs.140%29.aspx 【参考方案1】:

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

您需要一个用于T 的托管类型,它与您在C++ 中使用的SomeObject 等效。您还必须将这些对象从托管类型克隆到您的 std:list

如果您无法更改 C++/CLI 代码,则必须编写一个 shim 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

【讨论】:

以上是关于调用以 std::list 作为参数的 C++ 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数发送到 HTTPService 调用以作为组件重用

std::initializer_list 作为函数参数

C ++:将成员函数作为普通函数指针传递的闭包

对 Spring Boot 控制器的 Ajax 调用以重定向视图

通过休眠调用以数组为参数的oracle函数

C++:你在使用 Loki 还是 Boost 作为函子?