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

标签 c# c++ pinvoke clr marshalling

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

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

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

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

最佳答案

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

您需要一个托管类型 T ,相当于 SomeObject 的东西你在 C++ 中使用。您必须将这些对象从托管类型克隆到您的 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

关于c# - 调用以 std::list 作为参数的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42710507/

相关文章:

c# - 如何访问列表框内的复选框?

c# - 使用 LINQ 从集合内的集合属性中检索最大数字

c++ - 就地修改 vector 的元素

c# - 将包含未知大小的 int 数组的结构从 c# 传递到 c 并返回

c# - 尝试编写鼠标单击代码时 PInvoke 签名出错

c# - 如何在C#中将参数传递给线程

c# - 多个筛选条件 Azure 表存储

c++ - 如何使用大小未知的 boost::array 作为对象变量

c++ - std::less<> 不适用于我的 std::map

c# - 将 C# 位图转换为 Windows dib 句柄以用于 RIOT?