Можно воспользоваться преобразованием из string в массив байтов — функция
Encoding.Unicode.GetBytes для UTF16
Encoding.UTF8.GetBytes для Utf8 и тд
При этом нужно не забыть обеспечить в конце строки нулевой символ.
Если строка будет использоваться для COM - выделение памяти через AllocCoTaskMem, если для вызовов неуправляемого кода — AllocHGlobal.
Ну и не забыть освободить память после использования.
var str = "abc\0";
var UTF16data = Encoding.Unicode.GetBytes(str);
var len = UTF16data.Length;
IntPtr pData = Marshal.AllocCoTaskMem(len);
// IntPtr pData = Marshal.AllocHGlobal(len);
… использование pData …
Marshal.Copy(UTF16data, 0, pData, len);
Marshal.FreeCoTaskMem(pData);
// Marshal.FreeHGlobal(pData);