Функции, которые возвращают строку, являются проблемой управления памятью. Память для строки должна быть освобождена. Маршаллер pinvoke собирается вызвать CoTaskMemFree () для возвращаемой строки. Это может привести к сбою в Vista и выше, тихой утечке памяти в XP, поскольку строка не была выделена CoTaskMemAlloc.
Вам нужно будет объявить тип возвращаемого значения как IntPtr, чтобы маршаллер не смог это сделать. И соберите его сами с помощью Marshal.PtrToStringAnsi (). Это решает сбой, но не утечку памяти. Вам нужно объявить функцию как void f_detect (const char * path, char * somevalue, size_t somevaluebuffersize), чтобы вызывающая сторона могла передавать свой собственный буфер. StringBuilder на управляемой стороне.