C# 入門 & 実践 / C sharp

101. アンマネージ DLL の使用 - 3 - 文字列、参照渡し


DLLに
bool getString( char* text )
という関数のとき

+ textを渡すだけだったら String で構わないのですが
[DllImport(@"xxxx.dll")]

private extern static bool getString( String text );
+ これを値を返すように参照渡しにすると上手く行きません!
[DllImport(@"xxxx.dll")]
private extern static bool getString( ref String text );
使用する側
String myText = "";
getString( ref myText );
ランタイムの重大なエラーが発生しました。エラーのアドレスは 0x79ef067e、スレッド 0xe44 です。エラー コードは 0xc0000005 です。
これは CLR のバグであるか、またはユーザー コードのアンセーフまたは確認不可能な部分にバグがある可能性があります。このバグの一般的な原因には、スタックが壊れる可能性のある COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。

* 受け取る必要がある場合は、
StringBuilderを使用すると解決できます。
[DllImport(@"xxxx.dll")]
private extern static bool getString( ref StringBuilder text );
使用する側
StringBuilder myText = new StringBuilder( "initial_data", 256 );
getString( ref myText );
こうすると割り当てたアドレスが固定なのでおそらく大丈夫なようです。
256より大きいデータは当然受け取れません^-^;

いちおrefを付けましたが、クラスなのでRef無しでも参照渡しになっています。



101. アンマネージ DLL の使用 - 2 - DllImportAttribute « 101. アンマネージ DLL の使用 » 101. アンマネージ DLL の使用 - 4 - 構造体

C# 入門 & 実践 / C sharp