質問: "ABCDEFG"; *str= new wchar_t[text.length() + 1]; mbstowcs(*str, text.c_str(), text.length()+1); } ```
回答: まずDllImportの定義自体が引数の数が違ってるし、呼び出し規約も書いてないし、voidなのにreturnのマーシャリング定義してるし、色々間違ってる気がします。あと、ネイティブ相互運用性のベスト プラクティスでは、StringBuilderでの受け渡しは回避すべき項目として記述されています。 あとは、なんだか関数の設計自体もおかしい気がします。 1. 呼び出し側でバッファ確保するのが前提 2. CppCode側でバッファ確保するのが前提 どちらなのでしょう?サンプルコードを見る限り、両方でバッファ確保しようとしてますが。 1であれば、CppCode側でバッファ確保する必要はないでしょうし、呼び出し側からバッファのサイズも引数で渡すべきです。 2であれば、C#側でLPWStrを指定してるのはおかしいです。また、CppCodeで確保したメモリ解放用の関数も用意する必要があります。 1、2どちらの場合も、コピーした文字列の長さを返したほうがいいでしょう。 個人的には、1の方が解放用の関数用意しなくて済みますし、Cの標準関数の実装に近いので好みです。