2010-12-15 73 views
2

j'ai une fonction C avec ce prototype:pinvoke C#: comment puis-je mapper "const char ** output"?

void foo(const char **output); 

i compilé fichier C dans une DLL et je fais DllImport ("my.dll");

mais comment écrire C# prototype?

Merci beaucoup!

+0

Cela pourrait signifier plusieurs choses. Affiche un extrait qui montre comment foo() utilise l'argument. –

Répondre

2

Ce sera un pointeur sur un tableau d'octets:

private static extern void foo(IntPtr pointerToByteArray); 

Utilisation:

 fixed(byte* buffer = new byte[LENGTH_WHICH_YOU_KNOW_IS_ENOUGH]) 
     { 
      IntPtr ptr = new IntPtr(buffer); 
      foo(ptr); 
     } 
+0

merci beaucoup, ça marche! J'ai utilisé le code suivant pour récupérer la valeur de la chaîne: IntPtr nestedPtr = Marshal.ReadIntPtr (ptr); string value = Marshal.PtrToStringAnsi (nestedPtr); –

+0

Vous pouvez éviter le 'unsafe' 'fixé (byte *' en utilisant 'IntPtr ptr = Marshal.AllocHGlobal (LENGTH_WHICH_YOU_KNOW_IS_ENOUGH);' – Tergiver

+0

N'oubliez pas 'Marshal.FreeHGlobal (ptr)' après avoir appelé foo et en extrayant la chaîne (utilisez une clause finally). – Tergiver