私のC#.Net 4.0プロジェクトでは、AppDomainsを使用してプラグインアセンブリをロードし、作業を依頼してAppDomainをアンロードして、メインプロセスでアセンブリを保持する必要はありません。CannotUnloadAppDomainExceptionを引き起こす原因となるスレッドを見つける
AppDomain.Unload()
を呼び出すと、特定のプラグインのうち、CannotUnloadAppDomainException
が表示されます。このプラグインは、catch
またはfinally
ブロックでスタックされているか、または長時間(〜10秒)かかっているバックグラウンドスレッドを開始したため、これが最も可能性が高いことがわかりました。残念ながら、スレッドはどこにあるのかわかりません。
これはお客様のマシンでのみ発生するため、デバッガを使用して対応することはできません。しかし、書き出しに役立つものが見つかると、ログファイルに情報を書き込むためのパッチを提供することができます。
プラグインアセンブリのソースコードがありますが、いくつかの静的解析といくつかのテストを実行しようとしていますが、かなり大きいので、またはfinally
。
私の質問:
私は子供のAppDomainに自分のコールスタックで実行中のスレッドの一覧を取得することができます
CannotUnloadAppDomainException
を取得時にどのような方法がありますか?catch
およびfinally
ブロック以外にも、この例外が発生する可能性がある他のコードセクションはありますか?