如何使用swig和C#处理字符串数组?

4

我的 C++ 类有一个名为 init 的方法:

int init(int argc, char **argv)

另外,我有一个回调函数:

void callback(int num, char **str)

我的问题是,Swig生成了一个奇怪的类SWIGTYPE_p_p_char.cs,而不是我期望的string[]。请给予建议。

1个回答

3

SWIG在arrays_csharp.i中有一些用于将数组传递给函数的类型映射。然而,对于char *INPUT[],没有一个类型映射,但我们可以调整类型映射以实现您想要的功能:

%module test

%include <arrays_csharp.i>

CSHARP_ARRAYS(char *, string)
%typemap(imtype, inattributes="[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0, ArraySubType=UnmanagedType.LPStr)]") char *INPUT[] "string[]"

%apply char *INPUT[]  { char **argv }

int foo(int argc, char **argv);

这里使用SWIG宏CSHARP_ARRAYS来生成string数组的typedef,但然后替换了imtype以便我们提供自己的编组信息。
我认为这应该已经足够了。如果您想要,可以在生成的模块中添加一个重载:
%pragma(csharp) modulecode = %{
  public static int foo(string[] argv) {
    return foo(argv.Length, argv);
  }
%}

注意:请仔细测试 - 我从未编写过C#程序(但是编写了很多SWIG + JNI)。我在MSDN论坛上找到了有关封送信息的信息,但除了检查SWIG输出是否正常之外,我还没有测试过任何内容。这似乎与这个答案相匹配,还增加了{{link3:SizeParamIndex}}。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接