Ответ OregonGhost верен только в том случае, если символ *, возвращаемый из GetDir, расположен в HGlobal или LocalAlloc. Я не могу вспомнить, какой из них, но CLR будет предполагать, что любой тип возвращаемого значения из функции PInvoke был присвоен одному или другому.
Более надежный способ - ввести возвращаемое значение GetDir как IntPtr. Затем вы можете использовать любую из функций Marshal.PtrToStringAnsi, чтобы получить строковый тип. Это также дает вам гибкость освобождения строки в соответствии с вашим выбором.
[DllImport("your.dll", CharSet = CharSet.Ansi)]
IntPtr GetDir(StringBuilder path);
Можете ли вы дать нам какие-либо другие советы относительно поведения GetDir? Изменяет ли это входную строку? Как распределяется возвращаемое значение? Если вы можете предоставить это, я могу дать гораздо лучший ответ.