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 来生成数组的 typedefstring
s,但随后替换了 imtype,以便我们可以提供自己的编组信息。
我认为这应该足够了。如果您愿意,可以使用以下命令向生成的模块添加重载:
%pragma(csharp) modulecode = %{
public static int foo(string[] argv) {
return foo(argv.Length, argv);
}
%}
注意:请仔细测试 - 我一生中从未编写过 C# 程序(但编写过很多 SWIG+JNI)。我找到了在 MSDN 论坛上整理信息 http://social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/1d743627-6c4b-4eaf-9008-500f25e58617但除了检查 SWIG 的输出看起来是否正常之外,还没有对此进行任何测试。这似乎匹配这个答案 https://stackoverflow.com/a/7644330/168175,加上SizeParamIndex http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.sizeparamindex%28v=vs.80%29.aspx.