1

libmonoを使用して、CコードからC#オブジェクトを呼び出しています。そのオブジェクトのメソッドのいくつかは、オブジェクトパラメータを取ります。たとえば、配列パラメータを使用してオブジェクトを呼び出すには、

MonoArray *data = mono_array_new(domain, mono_get_byte_class(), len);

mono_runtime_invoke次に、リストされているオブジェクトとパラメーターを使用して呼び出します。mono_array_new配列がとの間でガベージコレクションされていないことをどのように知ることができmono_runtime_invokeますか?

4

1 に答える 1

3

invoke()が呼び出される関数でデータポインタをローカル変数として保持している限り、ガベージコレクションは行われません。または、mono_runtime_invoke()の引数配列に格納する必要があるため、配列がローカル変数であることを確認してください(スタックまたはレジスタが割り当てられています。関数の引数はローカル変数と同等です)。

管理対象オブジェクトを静的変数、ローカルスレッド、mallocedメモリのどこかに保存する必要がある場合は、たとえば、mono_gchandle_new()APIを使用して、そのオブジェクトへの参照を自分で保持する必要があります。

于 2012-07-20T10:16:40.317 に答える