0

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に返される文字列が非常に大きくなる可能性があるためです。

monostringWindows C ++ COMインターフェイスの使用に関する提案を読みましたが、Linuxでは、Cからのアドレスを直接取得する方法を使用しようとしています。

以下の参照は、これが「不可能」であることを示しています。

http://www.mono-project.com/Interop_with_Native_Libraries#marshal-step-4

「ランタイムがマーシャリングされたメモリを割り当てる方法や、その持続時間を制御する方法はありません。これは非常に重要です。ランタイムが文字列をマーシャリングする場合(UTF-16からAnsiへの変換など)、マーシャリングされた文字列は次の長さしか持続しません。アンマネージコードは、呼び出しの終了後に解放されるため、このメモリへの参照を保持できません。この制限に従わないと、メモリアクセス違反やプロセスの停止などの「奇妙な動作」が発生する可能性があります。

しかし、この主題は後で、、、および同じドキュメントで扱われMarshallingますinPtrSafeHandles参照ブログは2004/2005のものですが、すぐに使用できる例はありません)。

利用可能な最新のドキュメントまたはコード例はありますか?


ループスの解決策をありがとう。私のようにC#を知らない人にとって、これらの呼び出しはというファイルで定義されたマクロであるobject.hため、ランタイムを動的にロードすると、未解決のシンボルとして報告されます。はい、どうぞ:

#define mono_string_chars(s) ((gunichar2*)(s)->chars)
#define mono_string_length(s) ((s)->length)

C#は最終的にポインタを使用しているようです。

4

1 に答える 1

1

そのドキュメントは、P / Invokeでのマーシャリングに関するものです。これは、表示しているCコードとは関係のない別のトピックです。

あなたの質問に関しては:mono_string_chars()とmono_string_length()を使用して、文字列文字にアクセスし、それらを使ってやりたいことを行うことができます。たとえば、LinuxおよびOSXで使用可能なiconv()を使用したり、UTF16からUTF8に手動で変換して最大限の制御を行うことができます。

于 2012-08-26T09:23:03.047 に答える