C
以下のコードをより効率的なものに置き換えようとしています。
void mstr2str(MonoString *mstr)
{
char *str = mono_string_to_utf8(mstr);
printf("mono string: %s\n", str);
g_free(str);
}
私の目標は、mono_string_to_utf8()に付属するメモリ割り当てとデータコピーを回避することです。これは、C#からCに返される文字列が非常に大きくなる可能性があるためです。
monostring
Windows C ++ COMインターフェイスの使用に関する提案を読みましたが、Linuxでは、Cからのアドレスを直接取得する方法を使用しようとしています。
以下の参照は、これが「不可能」であることを示しています。
http://www.mono-project.com/Interop_with_Native_Libraries#marshal-step-4
「ランタイムがマーシャリングされたメモリを割り当てる方法や、その持続時間を制御する方法はありません。これは非常に重要です。ランタイムが文字列をマーシャリングする場合(UTF-16からAnsiへの変換など)、マーシャリングされた文字列は次の長さしか持続しません。アンマネージコードは、呼び出しの終了後に解放されるため、このメモリへの参照を保持できません。この制限に従わないと、メモリアクセス違反やプロセスの停止などの「奇妙な動作」が発生する可能性があります。
しかし、この主題は後で、、、および同じドキュメントで扱われMarshalling
ますinPtr
(SafeHandles
参照ブログは2004/2005のものですが、すぐに使用できる例はありません)。
利用可能な最新のドキュメントまたはコード例はありますか?
ループスの解決策をありがとう。私のようにC#を知らない人にとって、これらの呼び出しはというファイルで定義されたマクロであるobject.h
ため、ランタイムを動的にロードすると、未解決のシンボルとして報告されます。はい、どうぞ:
#define mono_string_chars(s) ((gunichar2*)(s)->chars)
#define mono_string_length(s) ((s)->length)
C#は最終的にポインタを使用しているようです。