В вашем определении PInvoke просто объявите параметр char * как байт [], и стандартный маршаллер будет обрабатывать работу.
Но это может быть или не быть лучшей идеей. Ожидает ли функция C ++ строку или буфер данных (код C / C ++ часто использует char * для буфера, полагаясь на тот факт, что char является одним байтом)?
Если это буфер, тогда байт [], безусловно, правильный, но если он ожидает строку, он может быть более понятным, если вы объявите параметр как строку (чтобы быть явным) и используете Encoding.ASCII.GetString () преобразовать байт [] в строку.
Кроме того, если функция C ++ ожидает строку и вы решили объявить параметр как byte [], убедитесь, что байтовый массив заканчивается нулем, поскольку именно так C / C ++ определяет конец строки.