まず、MSDNのCriticalFinalizerObjectについて読みましょう。次のように読むことができます。
CriticalFinalizerObjectクラスから派生したクラスでは、共通言語ランタイム(CLR)は、CLRがアプリケーションドメインを強制的にアンロードする状況でも、ファイナライザーがCERのルールに従っている場合、すべての重要なファイナライズコードが実行される機会を保証します。またはスレッドを中止します。
ここでの主な言葉はUNLOADです。
次に、 MSDNをもう一度読みましょう。今回は、マネージスレッドの例外について説明します。
これらの例外がメインスレッド、またはアンマネージコードからランタイムに入ったスレッドで処理されない場合、それらは正常に進行し、アプリケーションが終了します。
主な言葉はTERMINATIONです。
したがって、メインスレッドに未処理の例外がある場合、アプリは終了しますが、CriticalFinalizerObjectはドメインのアンロードにのみ役立ちます。
たとえば、CriticalFinalizerObjectは、次のような状況で役立ちます。
// Create an Application Domain:
AppDomain newDomain = AppDomain.CreateDomain("NewApplicationDomain");
// Load and execute an assembly:
newDomain.ExecuteAssembly(@"YouNetApp.exe");
//Unload of loaded domain
AppDomain.Unload(newDomain);
これは、ドメインがアンロードされ、CriticalFinalizerObjectがファイナライザーが呼び出されることを保証する状況です。
アプリの終了を伴うあなたの状況では、あなたは購読を試みることができます
AppDomain.CurrentDomain.UnhandledException
オブジェクトを手動でファイナライズします。
UPD:
Jeffrey Richterは、彼の著書「CLR via C#」で、CriticalFinalizerObjectについて書いています。これは、たとえば、C#をプロシージャとして実行できるSQLServerにコードを送信する場合に使用します。このような場合、SQLServerがライブラリのドメインをアンロードする場合、CriticalFinalizerObjectはオブジェクトをクリーンアップするのに役立ちます。また、CriticalFinalizerObjectは、オブジェクトのファイナライザーで別のオブジェクトのメソッドを呼び出す必要がある場合に使用します。CriticalFinalizerObjectは、CriticalFinalizerObject以外のすべてのオブジェクトのファイナライザーの後にファイナライザーが呼び出されることを保証します。