シナリオは非常に単純で、アプリにモノラルランタイムを埋め込み、次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ハンドルを使用せずに)ガベージされないと想定しても安全です。 )?