0

シナリオは非常に単純で、アプリにモノラルランタイムを埋め込み、次2.10.8のように取得したポインターを介してマネージドメソッドを呼び出していますmono_method_get_unmanaged_thunk

// obtain pointer
bool (__stdcall*foo) (MonoException**);
foo = mono_method_get_unmanaged_thunk(somemethod);

// call it
MonoException* exc;
foo(&exc);
if(exc)
    // handle exception
// nothing else...

何が私を困惑させますか、私がMonoExceptionポインターで他に何もしていないこと(私が読んだドキュメントはこれについて何も述べていません)。削除はマネージドランタイムによって処理されますか?もしそうなら、私のネイティブ側がそれへのポインタを保持していないことをどのように確認できますか?

編集

ソースを読んだところ、例外はで作成されたオブジェクトへの単なるポインタmono_object_newであるため、ガベージコレクションの対象であることがわかりました。

今、私はまた、ネイティブ側にいくつかのポインターを保持し、それがゴミになるのを防ぎたい場合は、そのためのGCハンドルを取得する必要があることも読みました。したがって、(変更された)質問は次のようになります。

返された例外オブジェクトへのポインタのポイントがエラー報告機能としてのみ機能し、そのようなエラー報告がマネージド呼び出しの直後に行われる場合、処理する前に(gcハンドルを使用せずに)ガベージされないと想定しても安全です。 )?

4

1 に答える 1

1

リンクしたページを引用するには: LOCAL変数はスタックに格納されているため、この登録は必要ないことに注意してください。グローバル変数はGCのルートセットの一部ではないため、グローバル変数にのみ必要です。

つまり、シナリオではハンドルを割り当てる必要がないということです。

于 2012-11-06T17:21:59.153 に答える