Dire, ho ottenuto che il prototipo di una funzione che viene esposta in una DLL:Come si chiama una funzione non gestita che ha un carattere [] come parametro OUT da C#?
int CALLBACK worker (char* a_inBuf, int a_InLen,
char** a_pOutBuf, int* a_pOutLen,
char** a_pErrBuf, int* a_pErrLen)
Sono sicuro che è ridicolmente facile chiamare quella funzione DLL dal mio codice C#, ma non funziona con questo codice:
[DllImport("mydll.dll")]
public static extern int worker(
[In, MarshalAs(UnmanagedType.LPArray)] byte[] inBuf,
int inputLen,
[Out, MarshalAs(UnmanagedType.LPArray)] byte[] outBuf,
out int outputLen,
[Out, MarshalAs(UnmanagedType.LPArray)] byte[] errBuf,
out int errorLen);
...
int outputXmlLength = 0;
int errorXmlLength = 0;
byte[] outputXml = null;
byte[] errorXml = null;
worker(input, input.Length, output, out outputLength, error, out errorLength);
ricevo una violazione di accesso quando vado a prendere la memoria per output
e error
dentro la mia biblioteca non gestito (e quindi de-riferimento il puntatore passato):
*a_ppBuffer = (char*) malloc(size*sizeof(char));
Come si scrive l'istruzione
DLLIMPORT
nel codice C# per questa funzione?Come posso effettivamente chiamare la funzione in modo che
a_pOutBuf
ea_pErrBuf
sono accessibili e nonnull
dall'internoworker
(vale a dire utilizzare un vero e proprio doppio puntatore)?
È possibile modificare la firma della funzione di lavoro? –
@SimonMourier: no. è una DLL usata in un programma C++ (API stabilita) e dovrebbe ora essere chiamata anche da una applicazione .net appena sviluppata. Pertanto l'API è fissa. – eckes