C ++ char * по ссылке на C# строку - PullRequest
0 голосов
/ 24 марта 2020

Иметь dll, написанную на C ++, которая имеет символьные значения *

[functionName](parameter, out char*)

При попытке получить значение из C#, получите только 1-й символ. Переменная имеет длину 5.

1 Ответ

0 голосов
/ 24 марта 2020

В стандарте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...