我的 C++ 类有一个名为init
:
int init(int argc, char **argv)
另外,我有一个回调:
void callback(int num, char **str)
我的问题是 Swig 生成了一个奇怪的 class SWIGTYPE_p_p_char.cs
,并且没有string[]
像我预期的那样。请指教。
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
s 数组生成 typedef,然后替换 imtype,以便我们可以提供自己的编组信息。
我认为这应该足够了。如果您愿意,可以使用以下命令向生成的模块添加重载:
%pragma(csharp) modulecode = %{
public static int foo(string[] argv) {
return foo(argv.Length, argv);
}
%}
注意:仔细测试一下——我这辈子从来没有写过 C# 程序(但写过很多 SWIG+JNI)。我在 MSDN 论坛上找到了编组信息,但除了检查 SWIG 的输出是否正常之外,还没有测试任何这些信息。这似乎与这个答案相匹配,加上SizeParamIndex
.