Это ужасная сигнатура функции, нет никакого способа угадать, как была расположена строка. Вы также не можете освободить память для строки. Если вы объявите возвращаемый тип как «string» в объявлении, тогда маршаллер P / Invoke вызовет CoTaskMemFree () для указателя. Это вряд ли будет уместным. В XP произойдет тихий сбой, но ваша программа выйдет из строя в Vista и Win7.
Вы даже не можете надежно вызвать функцию в неуправляемой программе. Вероятность того, что вы используете правильную версию free (), довольно мала. Все, что вы можете сделать, это объявить его как IntPtr и самостоятельно упорядочить возвращаемое значение с помощью Marshal.PtrToStringAnsi (). Обязательно напишите тестовую программу, которая делает это миллион раз, пока вы наблюдаете это в Taskmgr.exe. Если размер виртуальной машины для программы растет без ограничений, у вас есть утечка памяти, которую вы не можете подключить.