2016-09-16 15 views
1

私のC#.Net 4.0プロジェクトでは、AppDomainsを使用してプラグインアセンブリをロードし、作業を依頼してAppDomainをアンロードして、メインプロセスでアセンブリを保持する必要はありません。CannotUnloadAppDomainExceptionを引き起こす原因となるスレッドを見つける

AppDomain.Unload()を呼び出すと、特定のプラグインのうち、CannotUnloadAppDomainExceptionが表示されます。このプラグインは、catchまたはfinallyブロックでスタックされているか、または長時間(〜10秒)かかっているバックグラウンドスレッドを開始したため、これが最も可能性が高いことがわかりました。残念ながら、スレッドはどこにあるのかわかりません。

これはお客様のマシンでのみ発生するため、デバッガを使用して対応することはできません。しかし、書き出しに役立つものが見つかると、ログファイルに情報を書き込むためのパッチを提供することができます。

プラグインアセンブリのソースコードがありますが、いくつかの静的解析といくつかのテストを実行しようとしていますが、かなり大きいので、またはfinally

私の質問:

  1. 私は子供のAppDomainに自分のコールスタックで実行中のスレッドの一覧を取得することができますCannotUnloadAppDomainExceptionを取得時にどのような方法がありますか?

  2. catchおよびfinallyブロック以外にも、この例外が発生する可能性がある他のコードセクションはありますか?

答えて

0

this postに記載されているMicrosoft.Diagnostics.Runtimeライブラリ(NuGet package)を使用して、子AppDomainの関数が返される直前に、実行中のすべてのスレッドと呼び出しスタックをリストすることができました。私は一時的にアプリケーションを.NET 4.5にアップグレードしてライブラリを実行する必要がありましたが、ライブラリのソースはavailable on GitHubです。< .Net 4.5

でこのライブラリを構築することができます。データベースがローカルマシン上でSSLを使用しているときに、ロックされたスレッドを残したデータベース接続を処理する第三者のライブラリのバグ。

1

それはあなたが、例外が発生した正確な瞬間の間に実行されているかについて、いくつかのより詳細な情報を取得してみましょうする必要があり、それが発生したときに、プログラムのETWトレースを取得するには、クライアントの実行PerfViewを持っています。使用方法を示すa set of video tutorials from Channel 9です。

関連する問題