4

我的 C++ 类有一个名为init

int init(int argc, char **argv)

另外,我有一个回调:

void callback(int num, char **str)

我的问题是 Swig 生成了一个奇怪的 class SWIGTYPE_p_p_char.cs,并且没有string[]像我预期的那样。请指教。

4

1 回答 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 为strings 数组生成 typedef,然后替换 imtype,以便我们可以提供自己的编组信息。

我认为这应该足够了。如果您愿意,可以使用以下命令向生成的模块添加重载:

%pragma(csharp) modulecode = %{
  public static int foo(string[] argv) {
    return foo(argv.Length, argv);
  }
%}

注意:仔细测试一下——我这辈子从来没有写过 C# 程序(但写过很多 SWIG+JNI)。我在 MSDN 论坛上找到了编组信息,但除了检查 SWIG 的输出是否正常之外,还没有测试任何这些信息。这似乎与这个答案相匹配,加上SizeParamIndex.

于 2012-09-20T14:27:14.763 回答