调用以 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 的等效属性。
【问题讨论】:
Astd::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
。这是最简单的解决方法。您可以改为将其设为实现IEquatable
和iComparable
的ref 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 调用以作为组件重用