2010-12-15 11 views
2

ich habe eine C-Funktion mit diesem Prototyp:pinvoke C#: Wie kann ich "const char ** output" zuordnen?

void foo(const char **output); 

i C-Datei in eine DLL kompiliert und ein i DllImport ("my.dll") machen;

aber wie soll ich C# Prototyp schreiben?

Vielen Dank!

+0

Diese mehrere Dinge bedeuten könnte. Zeigen Sie ein Snippet, das zeigt, wie foo() das Argument verwendet. –

Antwort

2

die einen Zeiger auf Byte-Array sein:

private static extern void foo(IntPtr pointerToByteArray); 

Verbrauch:

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

vielen dank, es funktioniert! Ich habe folgenden Code zum Wiederherstellungswert der Zeichenfolge verwendet: IntPtr nestedPtr = Marshal.ReadIntPtr (ptr); Zeichenfolgenwert = Marshal.PtrToStringAnsi (nestedPtr); –

+0

Sie können die 'unsichere' 'behoben (Byte *' mit 'IntPtr ptr = Marshal.AllocHGlobal (LENGTH_WHICH_YOU_KNOW_IS_ENOUGH);' – Tergiver

+0

Vergessen Sie nicht, Marshal.FreeHGlobal (ptr) 'nach dem Aufruf foo und extrahieren die Zeichenfolge (benutze eine finally-Klausel) – Tergiver