Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数
Posted
技术标签:
【中文标题】Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数【英文标题】:Swig: pass std::vector<unsigned char> to c# function generated from c++ 【发布时间】:2019-07-03 15:57:48 【问题描述】:我有一个 C++ 函数:
std::map<std::string, std::string> foo(const std::vector<unsigned char>& v);
Swig 生成以下 C# 函数:
MapStringString foo(SWIGTYPE_p_std__vectorT_unsigned_char_t v);
我想在 C# 函数中调用它,该函数接收 byte[] 并返回 IDictionary,即:
IDictionary<string, string> bar(byte[] b)
SWIGTYPE_p_std__vectorT_unsigned_char_t b1;
// initialize b1 from b
MapStringString m = foo(b1);
IDictionary<string, string> result;
// Populate result from MapStringString
return result;
如何从 b 初始化 b1(即 SWIGTYPE_p_std__vectorT_unsigned_char_t 从 byte[])以及如何从 MapStringString 填充 IDictionary?
提前致谢!
【问题讨论】:
我不知道 swig,但是 Visual Studio 中的 IntelliSense,或者 Visual Studio 的对象浏览器(右键单击类型名称,从上下文菜单中选择“转到定义”)应该可以告诉你 swig 生成的SWIGTYPE_p_std__vectorT_unsigned_char_t
和 MapStringString
类型提供了哪些方法/字段/属性/索引器。我希望一旦你真正看到/知道这些类型提供的方法/字段/属性/索引器应该不会太难......
谢谢! Visual Studio 中的 SWIGTYPE_p_std__vectorT_unsigned_char_t 向我展示了 4 种方法:Equals、GetHashCode、GetType、ToString - 它们看起来都不适合提取数组元素。
SWIGTYPE_p_std__vectorT_unsigned_char_t
是否可能派生自可能提供更多有用成员的基类?
不,它不是从任何类派生的。它实际上是一个生成的类。互联网上到处都是 Swig 帮助显示如何生成类,但无处显示如何使用它们。
好吧,除非有人可以帮助你喝 swig(正如我所说,我不知道 swig;我什至不知道 swig 是否以及如何能够编组复杂的 C++ 类型,这将是相当的壮举)。 (1/2)
【参考方案1】:
您可以在 SWIG 界面中使用类似的内容快速开始:
%include <std_vector.i>
%template(VectorUChar) std::vector<unsigned char>;
这应该给你一个真正的类型,你可以在 C# 中使用它,它是 C++ std::vector 的代理。 (例如,它适用于您的 bar()
函数,但在调用点几乎不能无缝)。
既然你实际上已经有了一个Byte[]
,你可能可以将一个类型映射放在一起,它可以透明地从指针+长度构造一个向量,如果这样更有用的话。
【讨论】:
谢谢!我被误导了 swig 默认生成 SWIGTYPE_p_std__vectorT_unsigned_char_t 并且该类型没有任何功能。现在我意识到我应该添加 %template(VectorUChar) std::vector以上是关于Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数的主要内容,如果未能解决你的问题,请参考以下文章
[swig-JavaScript] 是不是支持 std::vector<std::string>* 作为输出?
SWIG 如何正确包装 std::vector<double *>
如何使用 Python 列表在 C++ 中使用 SWIG 分配 std::vector?