En primer lugar, vamos a leer sobre CriticalFinalizerObject en MSDN, podemos leer que:
En clases derivadas de la Crítica clase alFinalizerObject, el Common Language Runtime (CLR) garantiza que todos los códigos críticos de finalización tendrán la oportunidad de ejecutarse, siempre que el finalizador siga las reglas para CER, incluso en situaciones donde el CLR forzadamente descarga un dominio de aplicación o cancela un hilo.
La palabra principal aquí es UNLOAD.
En segundo lugar, vamos a leer MSDN de nuevo, esta vez sobre Excepciones en subprocesos administrados:
Si estas excepciones son no controlada en el hilo principal, o en las discusiones que entraron en el tiempo de ejecución de código no administrado, se procede con normalidad, dando como resultado terminación de la aplicación.
La palabra principal es TERMINACIÓN.
Por lo tanto, cuando hay una excepción no controlada en el hilo principal, la aplicación finaliza, pero CriticalFinalizerObject solo ayuda en la descarga del dominio.
Por ejemplo, CriticalFinalizerObject puede ayuda en tal situación:
// 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);
Esta es una situación en la que se descargó de dominio, y CriticalFinalizerObject garantizo que su finalizador se llamará.
En su situación con la terminación de la aplicación se puede tratar de suscribirse a
AppDomain.CurrentDomain.UnhandledException
y finalizar manualmente los objetos.
UPD: Jeffrey Richter en su libro "CLR a través de C#" escribió sobre CriticalFinalizerObject, que es para situaciones en las que envíe el código de ejemplo para SQL Server, que puede funcionar como un C# procedimientos. En tal caso, CriticalFinalizerObject le ayuda a limpiar su objeto, si SQLServer descargará el dominio de su biblioteca. También CriticalFinalizerObject es para situaciones donde necesita en el finalizador del método object to call de otro objeto, porque CriticalFinalizerObject le garantiza que se llamará a su finalizador después de los finalizadores de todos los objetos no CriticalFinalizerObject.
¡Gracias por la respuesta detallada! Diría que palabras como "terminado" vs "descargado" no están muy bien definidas en estos documentos MS. En sentido común, tener algo "terminado" no significa necesariamente que no será "descargado", aunque como vemos no es así aquí ... – IlyaP
Agregué algunas actualizaciones para responder de "CLR a través de C#" – igofed