В стандарте C ++ нет такой вещи, как out
. Параметр должен быть либо char**
, либо char*&
, чтобы быть действительной ссылкой на указатель.
functionName(parameter, char**)
functionName(parameter, char*&)
В любом случае единственной причиной для передачи ссылки на указатель является функция собирается установить сам указатель на память, которую функция выделяет. В C# это будет лучше всего обрабатываться с использованием параметра ref IntPtr
или out IntPtr
, а затем код C# может использовать Marshal.PtrToStringAnsi()
для доступа к данным char
. После этого указатель (IntPtr
) должен быть передан обратно в DLL для правильного освобождения выделенных данных char
.
Например:
[DllImport("my.dll", CallingConvention = ..., EntryPoint = "...")]
int getData(parameter, out IntPtr ptr);
[DllImport("my.dll", CallingConvention = ..., EntryPoint = "...")]
void freeData(IntPtr ptr);
...
IntPtr ptr = IntPtr.Zero;
int len = getData(parameter, out ptr);
string s = Marshal.PtrToStringAnsi(ptr, len);
freeData(ptr);