AppDomainUnloadedException (Clase)

Excepción que se produce al intentar obtener acceso a un dominio de aplicaciones descargado.

Espacio de nombres: System
Ensamblado: mscorlib (en mscorlib.dll)

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public class AppDomainUnloadedException : SystemException
/** @attribute SerializableAttribute() */ 
/** @attribute ComVisibleAttribute(true) */ 
public class AppDomainUnloadedException extends SystemException
SerializableAttribute 
ComVisibleAttribute(true) 
public class AppDomainUnloadedException extends SystemException

En la versión 2.0 de .NET Framework, una AppDomainUnloadedException que no se controla en el código de usuario tiene el efecto siguiente:

  • Si se inició un subproceso en el código administrado, finaliza. La excepción no controlada no puede finalizar la aplicación.

  • Si se está ejecutando una tarea en un subproceso ThreadPool, finaliza y el subproceso regresa al grupo de subprocesos. La excepción no controlada no puede finalizar la aplicación.

  • Si se inició un subproceso en el código no administrado, como el subproceso de la aplicación principal, éste finaliza. La excepción no controlada puede continuar y el sistema operativo finaliza la aplicación.

AppDomainUnloadedException utiliza HRESULT COR_E_APPDOMAINUNLOADED, que tiene el valor 0x80131014.

Para obtener una lista con los valores de propiedad iniciales de una instancia de AppDomainUnloadedException, vea los constructores AppDomainUnloadedException.

Esta sección contiene dos ejemplos de código. El primer ejemplo muestra los efectos de AppDomainUnloadedException en distintos subprocesos y el segundo muestra la descarga del dominio de aplicación elemental.

Ejemplo 1

En el ejemplo de código siguiente se define una clase TestClass para la que se pueden calcular referencias a través de los límites del dominio de aplicación y una clase Example que contiene un método ThreadProcstatic (Shared en Visual Basic). El método ThreadProc crea un dominio de aplicación, crea un objeto TestClass en el dominio y llama a un método de TestClass que descarga el dominio en ejecución, provocando una AppDomainUnloadedException.

El método TestClass se ejecuta sin control de excepciones desde un subproceso ThreadPool y desde un subproceso ordinario, lo que demuestra que la excepción no controlada finaliza la tarea o el subproceso, pero no la aplicación. Después, se ejecuta con y sin control de excepciones desde el subproceso de aplicación principal, lo que demuestra que finaliza la aplicación si no se controla.

using System;
using System.Threading;
using System.Runtime.InteropServices;

public class Example
{
    public static void Main()
    {
        // 1. Queue ThreadProc as a task for a ThreadPool thread.
        ThreadPool.QueueUserWorkItem(ThreadProc, " from a ThreadPool thread");
        Thread.Sleep(1000);

        // 2. Execute ThreadProc on an ordinary thread.
        Thread t = new Thread(ThreadProc);
        t.Start(" from an ordinary thread");
        t.Join();

        // 3. Execute ThreadProc on the main thread, with 
        //    exception handling.
        try
        {
            ThreadProc(" from the main application thread (handled)");
        }
        catch (AppDomainUnloadedException adue)
        {
            Console.WriteLine("Main thread caught AppDomainUnloadedException: {0}", adue.Message);
        }

        // 4. Execute ThreadProc on the main thread without
        //    exception handling.
        ThreadProc(" from the main application thread (unhandled)");

        Console.WriteLine("Main: This message is never displayed.");
    }

    private static void ThreadProc(object state)
    {
        // Create an application domain, and create an instance
        // of TestClass in the application domain. The first
        // parameter of CreateInstanceAndUnwrap is the name of
        // this executable. If you compile the example code using
        // any name other than "Sample.exe", you must change the
        // parameter appropriately.
        AppDomain ad = AppDomain.CreateDomain("TestDomain");
        TestClass tc = (TestClass)ad.CreateInstanceAndUnwrap("Sample", "TestClass");

        // In the new application domain, execute a method that
        // unloads the AppDomain. The unhandled exception this
        // causes ends the current thread.
        tc.UnloadCurrentDomain(state);

        Console.WriteLine("ThreadProc: This message is never displayed.");
    }
}

// TestClass derives from MarshalByRefObject, so it can be marshaled
// across application domain boundaries. 
//
public class TestClass : MarshalByRefObject
{
    public void UnloadCurrentDomain(object state)
    {
        Console.WriteLine("\nUnloading the current AppDomain{0}.", state);
 
        // Unload the current application domain. This causes
        // an AppDomainUnloadedException to be thrown.
        //
        AppDomain.Unload(AppDomain.CurrentDomain);
    }
}

/* This code example produces output similar to the following:
Unloading the current AppDomain from a ThreadPool thread.

Unloading the current AppDomain from an ordinary thread.

Unloading the current AppDomain from the main application thread (handled).
Main thread caught AppDomainUnloadedException: The application domain in which the thread was running has been unloaded.

Unloading the current AppDomain from the main application thread (unhandled).

Unhandled Exception: System.AppDomainUnloadedException: The application domain in which the thread was running has been unloaded.
   at TestClass.UnloadCurrentDomain(Object state)
   at Example.ThreadProc(Object state)
   at Example.Main()
 */

Ejemplo 2

En el ejemplo de código siguiente se crea y se descarga un dominio de aplicación y se muestra que se produce una AppDomainUnloadedException en un intento posterior de acceso al dominio descargado.

using System;
using System.Reflection;
using System.Security.Policy;  //for evidence object
class ADUnload
{
	public static void Main()
	{

		//Create evidence for the new appdomain.
		Evidence adevidence = AppDomain.CurrentDomain.Evidence;

 		// Create the new application domain.
 		AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence);

            	Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName);
            	Console.WriteLine("child domain: " + domain.FriendlyName);
		// Unload the application domain.
		AppDomain.Unload(domain);

		try
		{
		Console.WriteLine();
		// Note that the following statement creates an exception because the domain no longer exists.
            	Console.WriteLine("child domain: " + domain.FriendlyName);
		}

		catch (AppDomainUnloadedException e)
		{
		Console.WriteLine("The appdomain MyDomain does not exist.");
		}
		
	}
	
}

import System.*;
import System.Reflection.*;
import System.Security.Policy.*; //for evidence object

class ADUnload
{
    public static void main(String[] args)
    {
        // Create evidence for the new appdomain.
        Evidence adEvidence = AppDomain.get_CurrentDomain().get_Evidence();

        // Create the new application domain.
        AppDomain domain = AppDomain.CreateDomain("MyDomain", adEvidence);

        Console.WriteLine("Host domain: " 
            + AppDomain.get_CurrentDomain().get_FriendlyName());
        Console.WriteLine("child domain: " + domain.get_FriendlyName());

        // Unload the application domain.
        AppDomain.Unload(domain);
        try {
            Console.WriteLine();

            // Note that the following statement creates an exception 
            // because the domain no longer exists.
            Console.WriteLine("child domain: " + domain.get_FriendlyName());
        }
        catch (AppDomainUnloadedException e) {
            Console.WriteLine("The appdomain MyDomain does not exist.");
        }
    } //main
} //ADUnload

System.Object
   System.Exception
     System.SystemException
      System.AppDomainUnloadedException

Los miembros estáticos públicos (Shared en Visual Basic) de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition

.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

.NET Framework

Compatible con: 2.0, 1.1, 1.0

.NET Compact Framework

Compatible con: 2.0

Adiciones de comunidad

AGREGAR
Mostrar: