投稿数 - 437, コメント - 59540, トラックバック - 156

リバース P/Invoke と例外

Reverse P/Invoke and exception

昔、@IT会議室で「マネージデリゲートをコールバック関数としてアンマネージコードに渡してるんだけど、これってガベージコレクタされないの?」って議論があったのを思い出した。

以下は訳。誤訳たっぷりと思われるので、できれば本文を参照してほしい。

P/Invoke とは、マネージコードがネイティブの関数ポインタを実行する事だ。そして、リバース P/Invoke とは、ネイティブコードがマネージのデリゲートを関数ポインタとして実行する事で、大概はコールバックとなる。

ネイティブコードがマネージのデリゲート関数ポインタを実行したとき、実際には CLR thunk を呼んでいる。thunk は AppDomain transition から真のAppDomain に移行し、デリゲートを実行する。コールバックでマネージのデリゲートが未処理例外をスローしたら、AppDomain transition でコンテキストをまたがった例外として発生するだろう。きっと、ワトソン博士のエラーレポートも。

ワトソン博士が嫌いなら、以下の二つの事ができる。

1).マネージコードのトップレベルで try/catch ブロックを書いて、例外を全部捕まえる。はいはい、ネイティブコードにエラーを伝えるために若干のメカニズムが必要だよ。マネージデリゲートが、戻り値か out パラメータの一つに HRESULT を返すようにするんだ。

2).ICLRRuntimeHost::ExecuteInAppDomain を使う。そうすれば、CLR はどんな未処理例外でも HRESULT として呼び出し元に返す。

投稿日時 : 2008年1月29日 16:37

フィードバック

# re: リバース P/Invoke と例外

なんか囚人さんの超訳が好きです。
翻訳本だしてくださいョ。
2008/01/29 19:03 | れい

# re: リバース P/Invoke と例外

>なんか囚人さんの超訳が好きです。
>翻訳本だしてくださいョ。

ありがとうございます。
ただ、英語が超苦手です。
2008/01/29 21:52 | 囚人

# re: リバース P/Invoke と例外

今日読んでみたんですが。

マネージ コードとアンマネージ コード間でマーシャリングする
http://msdn.microsoft.com/msdnmag/issues/08/01/CLRInsideOut/default.aspx?loc=jp

なんか小難しいことが書いてあって理解できませんでした。
2008/01/29 22:11 | とおりすがり

# re: リバース P/Invoke と例外

>なんか小難しいことが書いてあって理解できませんでした。

確かにマーシャリング関連は小難しいですね…。
2008/01/30 10:45 | 囚人

# ZINMurZxWUEixjEy

http://imrdsoacha.gov.co/silvitra-120mg-qrms
2022/04/19 10:07 | johnanz

コメントの投稿

タイトル
名前
URL
コメント