Come posso elaborare array di stringhe con swig e C #?

La mia class C ++ ha init di metodo

int init(int argc, char **argv) 

Inoltre ho una richiamata,

 void callback(int num, char **str) 

Il mio problema è che swig genera una strana class SWIGTYPE_p_p_char.cs e nessuna stringa [] come previsto. per favore, consiglio.

SWIG ha alcuni typemaps per passare gli array alle funzioni, in arrays_csharp.i. Non ce n’è uno per char *INPUT[] ma possiamo adattare i typemap per fare ciò che vuoi:

 %module test %include  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); 

Questo utilizza la macro SWIG CSHARP_ARRAYS per produrre i typedef per una matrice di string , ma poi sostituisce l’imtype in modo che possiamo fornire le nostre informazioni sul marshalling.

Penso che dovrebbe essere sufficiente. Se vuoi, puoi aggiungere un sovraccarico al modulo generato con:

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

Nota: prova questo attentamente – non ho mai scritto un programma C # nella mia vita (ma ho scritto un sacco di SWIG + JNI). Ho trovato le informazioni di marshalling nei forum MSDN ma non ho verificato nulla di ciò oltre a verificare che l’output di SWIG sia sensato. Questo sembra corrispondere a questa risposta , con l’aggiunta di SizeParamIndex .