LPWSTR WINAPI StringTest(LPWSTR dest )
{
return dest;
}
このようなC++のコードを
[DllImport("hoge.dll", CharSet = CharSet.Unicode)]
static extern String StringTest(StringBuilder dest);
このように呼ぶと、マーシャラーがうまく受け渡し変換してくれます。
IntPtrを使う場合どうでしょう
[DllImport("hoge.dll", CharSet = CharSet.Unicode)]
static extern String StringTest(IntPtr dest);
このような感じにするとdestで渡したエリアをreturnしているので、マーシャラーがStringにうまくコピーしてくれるような気がします。
確かにデバッガで見る限り戻り値はうまく取得できるのですが、destの方が破壊されてしまうために、destを使い回している場合に動かなくなります。
どのような理屈でマーシャラーがdestの領域を壊しているのか分かりませんが、このような動きをする(destを戻すようなCの関数的なメソッド)関数をP/Invokeで呼ぶ場合には注意が必要です。
マーシャラーの関与を排除するためにはStringをIntPtrにします。
[DllImport("hoge.dll", CharSet = CharSet.Unicode)]
static extern IntPtr StringTest(IntPtr dest);