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_tMapStringString 类型提供了哪些方法/字段/属性/索引器。我希望一旦你真正看到/知道这些类型提供的方法/字段/属性/索引器应该不会太难...... 谢谢! 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;这将生成一个更好的类型而不是默认类型,并且该类型将具有所有必需的功能。 不用担心 - 通常,如果您看到 SWIGTYPE_ 之类的类型,则表明某些内容没有自动包装好,值得调查原因。 @Flexo,谢谢。以上信息对我也有帮助。但我试图用这种方法将 C++ 列表包装到 C#,但它失败了。在这种情况下你能帮帮我吗?我在这里被阻止(试图包装列表)。 如果它是一个列表,那么你将需要 std_list.i 而不是

以上是关于Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数的主要内容,如果未能解决你的问题,请参考以下文章

[swig-JavaScript] 是不是支持 std::vector<std::string>* 作为输出?

SWIG 如何正确包装 std::vector<double *>

如何使用 Python 列表在 C++ 中使用 SWIG 分配 std::vector?

C# SWIG 向量<字符串> 到字符串 []

如何在 SWIG 中将向量的锯齿状 C++ 向量转换(类型映射)为 Python

swig 在 C++ 中运行的结果与在 python 中的不同