ちょび日記

明日は明日の風が吹く

2016-11-06

P/Invokeでout string的なことをやるには


C関連のAPI設計だとよく引数に結果を格納する、みたいなやり方をすることが多かったりします。 (帰り値が一個しかない都合上)

で、C#のP/Invoke経由でこういった場合に文字列を格納したい、という場合 どうやるかというと、事前にStringBuilderで領域を確保しておいて 呼び出しをしてあげるのが良いみたいです。(StringBuilderはCの文字列っぽい構造なようです。)

var sb = new StringBuilder("", 1024);
Hoge(sb)

メソッド定義(C#)

[DllImport("Project1"]
public static extern void Hoge(StringBuilder out_str, int max_length);

関数定義(C++)

extern "C" __declspec(dllexport) void Hoge(char* out_str, int max_length) {
  //中略(out_strは既にStringBuilderでメモリを確保してあるので適当にコピーする)
  strcpy(out_str, value.c_str());
}

文字エンコーディングも絡んでくるので、そういう場合は別途キャラセットの指定が必要っぽ。



Copyright© 2016, chobie All rights reserved.