このドキュメントはアーカイブされており、メンテナンスされていません。

AppDomainUnloadedException クラス

アンロードされたアプリケーション ドメインにアクセスしようとするとスローされる例外。

名前空間: System
アセンブリ: mscorlib (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

.NET Framework Version 2.0 では、ユーザー コード内で処理されない AppDomainUnloadedException は、次のような影響を及ぼします。

  • スレッドがマネージ コード内で開始されている場合、そのスレッドは終了します。未処理の例外は、アプリケーションを終了できません。

  • ThreadPool スレッドでタスクを実行している場合、そのタスクは終了し、スレッドはスレッド プールに返されます。未処理の例外は、アプリケーションを終了できません。

  • メイン アプリケーション スレッドなど、アンマネージ コード内でスレッドを開始している場合、そのスレッドは終了します。未処理の例外は続行でき、オペレーティング システムはアプリケーションを終了します。

AppDomainUnloadedException は、値 0x80131014 を保持する HRESULT COR_E_APPDOMAINUNLOADED を使用します。

AppDomainUnloadedException のインスタンスの初期プロパティ値の一覧については、AppDomainUnloadedException コンストラクタのトピックを参照してください。

このセクションには、2 つのコード例が含まれています。1 つ目の例では、AppDomainUnloadedException がさまざまなスレッドに及ぼす影響を示し、2 つ目の例では、単一のアプリケーション ドメインのアンロードを示します。

例 1

アプリケーション ドメインの境界を越えてマーシャリングできる TestClass クラス、および static (Visual Basic では Shared) ThreadProc メソッドを含む Example クラスを定義するコード例を次に示します。ThreadProc メソッドは、アプリケーション ドメインを作成し、そのドメインに TestClass オブジェクトを作成して、TestClass のメソッドを呼び出します。このメソッドは、実行中のドメインをアンロードするため、AppDomainUnloadedException の原因となります。

未処理の例外によって、タスクまたはスレッドは終了しても、アプリケーションは終了しないことを示すために、TestClass メソッドを ThreadPool スレッドと通常のスレッドから例外処理を行わずに実行します。次に、例外が処理されていない場合でも、このメソッドがアプリケーションを終了することを示すために、メソッドをメイン アプリケーション スレッドから例外処理の有無を問わず実行します。

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()
 */

例 2

アプリケーション ドメインを作成し、アンロードするコード例を次に示します。また、この例では、アンロードされたドメインへのアクセス試行で、AppDomainUnloadedException がスローされることも示します。

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

この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。

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

開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。

.NET Framework

サポート対象 : 2.0、1.1、1.0

.NET Compact Framework

サポート対象 : 2.0
表示: