这里我正在编写包装器来调用 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/