Функции, которые возвращают строки, являются проблемой управления памятью. Кто-то должен освободить память для строки. Маршаллер pinvoke попытается позаботиться об этом, он использует CoTaskMemFree ().
На практике это вряд ли сработает, нативный код редко использует CoTaskMemAlloc () для выделения памяти строки. В XP это приводит к необратимой утечке памяти, в Vista и Win7 это приведет к сбою вашей программы. У них гораздо более строгий менеджер кучи.
Единственное, что вы можете сделать, это объявить тип возвращаемого значения как IntPtr. Затем выполните маршалирование возвращаемого значения самостоятельно с помощью функции Marshal.PtrToStringAnsi (). Это, безусловно, сработает, вероятность того, что вы получите правильное значение, довольно мала. Строка будет преобразована из Unicode в Ansi, это преобразование с потерями. Тогда вы должны освободить память. Ты не можешь Вы не можете вызвать эту функцию.