SWIG - 包装到 C# 时 std::list 没有默认类型映射,我该怎么办?

Posted

技术标签:

【中文标题】SWIG - 包装到 C# 时 std::list 没有默认类型映射,我该怎么办?【英文标题】:SWIG - No default typemap for std::list when wrapping to C#, how can I do? 【发布时间】:2017-04-25 09:52:16 【问题描述】:

我目前正在使用 SWIG 将大型 C++ 库包装到 C#。我面临一个大问题,因为我的库使用了大量 std::list,而且似乎 SWIG(我使用的是最新版本 3.0.12)不提供默认映射对于 std::list。我在网上找遍了,一无所获。我很惊讶,因为 std::list 与 C# LinkedList 非常相似!

反正我很久没在SWIG了,所以我真的不知道该怎么做。。我只知道我绝对不能改变所有的std::list 在我的库中,我真的很想将它们包装在 C# LinkedList 中,但我不知道这是否可能以及我是否可以轻松地做到这一点..

我查看了类型映射,但我不确定它是否能正常工作,因为将 std::list 映射到 LinkedList 似乎比使用简单类型映射更复杂..

各位,我需要你给我建议! 提前致谢, 昆汀。

【问题讨论】:

你考虑过 C++ / CLI 吗? 其实我们已经试过这个方案了。但最终,由于多种原因,它并没有达到我们想要的效果。主要原因是我们希望尽可能少地接触 lib 源代码。 【参考方案1】:

好吧,对于那些和我一样面临同样问题的人,我最终决定将自己的 std::list 实现转换为 C# LinkedList。

我今天在 SWIG GitHub 上提出了拉取请求。如果有人感兴趣,就去看看吧。它并不完美,但现在可以使用。

【讨论】:

这里是拉取请求的链接:github.com/swig/swig/pull/989

以上是关于SWIG - 包装到 C# 时 std::list 没有默认类型映射,我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWIG 在 Python 中公开 std::list 成员

将 SWIG 与 C# 结合使用时的最佳实践是啥?

更改 SWIG 包装函数返回值

SWIG / C#:命名空间和模板

使用 SWIG,如何将 C++ void func(Class& out) 包装为 C# Class func()?

Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?