StringBuilder, вероятно, является подходящим вариантом, но вы должны установить емкость строителя строк перед вызовом функции. Поскольку C # не знает, сколько памяти будет использовать GetDriveLeter
, вы должны убедиться, что у StringBuilder достаточно места. Затем маршаллер передаст функции char*
, выделенную для этой длины, и отправит ее обратно в StringBuilder.
[return:MarshalAsAttribute(UnmanagedType.I4)]
private static extern bool GetDriveLetter(StringBuilder DriveLetter);
public static bool GetDriveLetter(out string driverLetter) {
StringBuilder buffer = new StringBuilder(10);
bool ret = GetDriveLetter(buffer);
driveLetter = buffer.ToString();
return ret;
}
См. Пример p / invoke для GetWindowText () , например.