P/InvokeとCOM呼び出し時、UnmanagedType.LPWStr
のMarshal.FreeCoTaskMem
は不要らしいです。CoTaskMemFree
が必要なLPWSTR
はout IntPtr
やout SafeHandle
で受け取らなくても、out string
で受け取れば自動でMarshal.FreeCoTaskMem
されるそうです。
ただし複数回のコピーが発生するため、大きなデータの一部を扱う場合はout IntPtr
(現在はout nint
でも)などで受け取った方が良いかもしれません。また、LocalFree
やHeapFree
で解放すべきメモリはUnmanagedType.LPWStr
とout string
を指定するとメモリリークにつながる可能性があります。
UnmanagedType.LPStr
も変換処理は入りますが同様に解放されるそうです。