Я взаимодействую с кодом, который принимает char**
(то есть указатель на строку):
int DoSomething(Whatever* handle, char** error);
По сути, он переводит дескриптор в свое состояние, и если что-то идет не так,он возвращает код ошибки и, возможно, сообщение об ошибке (память выделяется извне и освобождается с помощью второй функции. Эту часть я выяснил :)).
Я, однако, не уверен, как обращаться св C #.То, что у меня сейчас есть:
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
private static unsafe extern int DoSomething(IntPtr handle, byte** error);
public static unsafe int DoSomething(IntPtr handle, out string error) {
byte* buff;
int ret = DoSomething(handle, &buff);
if(buff != 0) {
// ???
} else {
error = "";
}
return ret;
}
Я ковыряюсь, но не могу понять, как превратить это в byte[]
, подходящий для подачи на UTF8Encoding.UTF8.GetString()
Я на правильном пути?
РЕДАКТИРОВАТЬ: Чтобы сделать более явным, библиотечная функция выделяет память , которая должна быть освобождена путем вызова другой библиотечной функции .Если решение не оставляет меня с указателем, который я могу освободить, решение неприемлемо.
Дополнительный вопрос: как подразумевается выше, эта библиотека использует UTF-8 для своих строк.Нужно ли делать что-то особенное в моих P / Invokes, или просто использовать string
для нормальных const char*
параметров?