Я бы, наверное, сделал это с COM BSTR и не связывался с распределением буфера. Примерно так:
C ++
#include <comutil.h>
DECLDIR BSTR * setText(wchar_t * allText)
{
return ::SysAllocString(allText);
}
C #
[DllImport(@"firstDLL.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string setText(string allText);
BSTR - это собственный тип строки COM. Преимущество его использования в том, что память может быть выделена на собственной стороне интерфейса (в C ++) с помощью COM-распределителя, а затем уничтожена на управляемой стороне интерфейса с тем же распределителем. Маршаллер P / Invoke знает все о BSTR и обрабатывает все для вас.
Хотя вы можете решить эту проблему, передавая длину буфера, это приводит к довольно грязному коду, поэтому я предпочитаю BSTR.
Что касается вашего второго вопроса о P / Invoking string[]
, я думаю, вы найдете то, что вам нужно, от ответа Криса Тейлора до другого вопроса здесь, о переполнении стека.