Sto provando a scrivere un codice C# che chiama un metodo da una DLL non gestita. Il prototipo per la funzione nella DLL è:PInvoke per la funzione C che restituisce char *
extern "C" __declspec(dllexport) char *foo(void);
In C#, ho usato:
[DllImport(_dllLocation)]
public static extern string foo();
Sembra funzionare in superficie, ma sto ricevendo errori di corruzione della memoria durante l'esecuzione. Penso che sto indicando la memoria che sembra essere corretta, ma è già stata liberata.
Ho provato a utilizzare un'utilità di codice PInvoke chiamata "P/Invoke Interop Assistant". Mi ha dato l'output:
[System.Runtime.InteropServices.DLLImportAttribute(_dllLocation, EntryPoint = "foo")]
public static extern System.IntPtr foo();
È corretto? In tal caso, come posso convertire questo IntPtr in una stringa in C#?
Questo ha funzionato per me. L'unico cambiamento che ho dovuto fare è stato 'PtrToStringAuto' in' PtrToStringAnsi', altrimenti ho ottenuto alcuni caratteri cinesi – 3vts