4

私のC++クラスには次のメソッドがありinitます:

int init(int argc, char **argv)

また、私はコールバックを持っています:

void callback(int num, char **str)

私の問題は、Swigが奇妙なクラス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 に答える