Ответ 1
Вы должны вернуть это как IntPtr. Возвращение типа System.String из функции PInvoke требует большой осторожности. CLR должен передать память из собственного представления в управляемый. Это простая и предсказуемая операция.
Проблема, однако, связана с тем, что делать с исходной памятью, которая была возвращена из foo(). CLR принимает следующие два элемента о функции PInvoke, которая непосредственно возвращает тип строки
- Необходимо освободить встроенную память.
- Собственная память была выделена CoTaskMemAlloc
Поэтому он будет маршалировать строку, а затем вызовет CoTaskMemFree в блоке памяти. Если вы не выделили эту память с помощью CoTaskMemAlloc, это в лучшем случае приведет к сбою в вашем приложении.
Чтобы получить правильную семантику здесь, вы должны сразу вернуть IntPtr. Затем используйте Marshal.PtrToString *, чтобы перейти к управляемому значению String. Вы все равно можете освободить встроенную память, но это будет зависеть от реализации foo.