¿Por qué el error AppDomain.Unload () en el finalizador?

Aquí hay un código de ejemplo:

using System; namespace UnloadFromFinalizer { class Program { static void Main(string[] args) { Program p = new Program(); } AppDomain domain; Program() { this.domain = AppDomain.CreateDomain("MyDomain"); } ~Program() { AppDomain.Unload(this.domain);//<-- Exception thrown here } } } 

Tengo una clase que crea un dominio de aplicación en el constructor que se utilizará durante la vida útil del objeto. Me gustaría limpiar adecuadamente el dominio de aplicación, así que pensé que llamaría Descargar en el finalizador. Desafortunadamente, eso hace que se lance una CannotUnloadAppDomainException. La documentación de MSDN para las notas de AppDomain.Unload :

En algunos casos, llamar a Unload causa una excepción inmediata CannotUnloadAppDomainException, por ejemplo si se llama en un finalizador.

¿Por qué es esto? ¿La variable miembro “dominio” ya está limpia? ¿Esa limpieza incluye automáticamente la descarga del dominio de aplicación, o seguirá existiendo de alguna manera inalcanzable? ¿Hay algo que debería estar haciendo o puedo desechar el finalizador de forma segura? (Realmente no me importa cuando el GC se deshaga de mi objeto, siempre y cuando esté completamente limpio en el proceso).

La clase AppDomain no tiene un finalizador definido y, por lo tanto, solo se recolectará la basura normalmente. El finalizador de su clase de Program se llamará desde el subproceso finalizador del recolector de basura. Cuando esto sucede, no hay garantía de que su instancia de AppDomain se haya o no haya sido recolectada con basura todavía, por lo que obtendrá un comportamiento indeterminado.

No me molestaría con el finalizador del Program , ya que el AppDomain obtendrá la basura de todos modos, y además, todo el proceso se destruirá cuando el método Main salga de todos modos.