1

.NETAppDomain.AssemblyLoadイベントは、そのイベントハンドラー内でスローされた例外をキャッチし、アセンブリのロードをトリガーした呼び出し元にそれらを伝播しないようです(例Assembly.LoadFile())。

私の最初の質問は、なぜこれがすべての例外をキャッチするのかという動作が存在するのですか?Microsoftは一般に、例外が常にBCLで伝播するようにすることについてかなり厳格です。

私の2番目の質問ですが、この動作をオフにする方法はありますか?

背景:アセンブリが読み込まれるときにアセンブリをスキャンし、何らかの規則に準拠していることを確認する必要があります。そうでない場合は、例外をスローする必要があります(そして、アセンブリの負荷をトリガーする可能性のある複数のメカニズムによって、より高いレベルでキャッチされます)。

注:この質問「AppDomain.AssemblyLoadイベントから例外をスローする」はすでに見つかりましたが、これは重複していません。私の質問は、その質問の結論から論理的に続きます。

4

1 に答える 1

1

いいえ、例外はCLR内に飲み込まれ、その動作を変更する方法はありません。これは、ほとんどのAppDomainイベント(AssemblyLoad、DomainUnload、およびProcessExit)に当てはまります。SSCLI20ソースコードには、これが行われる理由を示すコメントはありません。

大まかな推測では、コードがCLRスタックフレームの奥深くに埋め込まれているため、適切な診断とフレームの巻き戻しができず、状態の復元が非常に困難です。AssemblyLoadは、ほとんどの場合、ジッターがコードの生成でビジー状態のときに発生し、DomainUnloadおよびProcessExitは、CLRがすべてのコード実行のシャットダウンでビジー状態であるためです。

回避策は明らかです。例外をキャッチする必要がある場合は、イベントハンドラーにtry/catchステートメントが必要です。

于 2012-09-21T13:00:25.153 に答える