文字列型をどうするかは悩ましいところです。
考えられる選択肢としては、大別して以下の3通りとなることでしょう。
メモリリークを受け入れて、String型とする。
unsafe にして、char *にする。
理論上は厳密にはあやまった方法ですが、.NET Frameworkの仕組み上、
現実的には通常問題が起きないやり方です。
理論上は理想の実装方法といえますが、本来やりたい「ただの文字列を返す処理」と、記述が乖離してしまうため、
何が書いてあるのかわかりにくくなってしまう方法です。
この3つの方法について、順に解説していきます。
この記述はメモリリークはありますが「移植性が最も高い方法」です。
「DllExport.bat による方法」→「hm.NET による方法」への移行、もしくは、「COMによる方法」への移行、
どちらに将来移行するにしても、
[DllExport] と [MarshalAs(UnmanagedType.LPWStr)] を削除するだけで、移行が完了し同じ動作(しかもメモリリークなし)が期待できるのがポイントです。