То, что вы делаете, выглядит довольно хорошо - единственное изменение, которое я бы сделал, - это использование Encoding.Unicode.GetByteCount(name)
вместо name.Length * 2
(просто более очевидно, что происходит).
Кроме того, вы можете использовать Marshal.PtrToStringUni(ptr)
, если вы уверены, что ваши неуправляемые данные являются Unicode, поскольку это устраняет любую двусмысленность в отношении вашего строкового кодирования.