la funzione nella DLL C si presenta così:PInvoke char * nella DLL C gestita come stringa in C#. Problema con caratteri nulli
int my_Funct(char* input, char* output);
devo chiamare questo da C# app. Lo faccio nel modo seguente:
...DllImport stuff...
public static extern int my_Funct(string input, string output);
La stringa di input è perfettamente trasmessa al DLL (ho la prova visibile di quello). L'output che la funzione compila sebbene sia sbagliato. Ho dati hexa in esso, come:
3F-D9-00-01
Ma purtroppo tutto ciò che è dopo i due zeri è tagliato, e solo i primi due byte vengono in C# app. Succede, perché (immagino) tratta come carattere null e lo prende come la fine della stringa.
Qualche idea su come potrei liberarmene? Ho provato a specificarlo come IntPtr invece di una stringa, ma non so cosa farmene dopo. Ho cercato di fare dopo:
byte[] b1 = new byte[2];
Marshal.Copy(output,b1,0,2);
2 dovrebbe essere normalmente la lunghezza della matrice di byte. Ma ottengo tutti i tipi di errori: come "L'intervallo richiesto si estende oltre la fine dell'array". o "Tentativo di leggere o scrivere memoria protetta ..."
Apprezzo qualsiasi aiuto.
(1) Le stringhe C# sono più larghe di un carattere; sono 2 caratteri piuttosto che 1. (2) Un carattere * restituito da questa funzione non avrà la struttura aggiuntiva necessaria per essere una stringa C# valida (anche se era della larghezza corretta). –
È necessario leggere su COM Interop e P/Invoke per imparare come eseguire questa azione. Fallo e richiamalo con qualsiasi domanda tu abbia con quel materiale. –
Il marshaller pinvoke supporta solo stringhe C. Chiaramente non è una stringa C quando ha byte che contano dopo lo 0. È quindi un byte []. Ma con l'hangup significativo, nessuno può capire come * molti * byte siano rilevanti. Questa funzione è molto difficile da usare anche dal codice C, che non migliora quando la si fa ruotare. Faresti meglio a sistemarlo. Usa MarshalAs.SizeConst se la lunghezza è prevedibile. –