AppDomainUnloadedException 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
嘗試存取卸除的應用程式域時所擲回的例外狀況。
public ref class AppDomainUnloadedException : SystemException
public class AppDomainUnloadedException : SystemException
[System.Serializable]
public class AppDomainUnloadedException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class AppDomainUnloadedException : SystemException
type AppDomainUnloadedException = class
inherit SystemException
[<System.Serializable>]
type AppDomainUnloadedException = class
inherit SystemException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type AppDomainUnloadedException = class
inherit SystemException
Public Class AppDomainUnloadedException
Inherits SystemException
- 繼承
- 屬性
範例
本節包含兩個程式代碼範例。 第一個範例示範 AppDomainUnloadedException 對各種線程的影響,第二個範例示範基本應用程式域卸除。
範例 1
下列程式代碼範例會定義可跨應用程式域界限封送處理的 TestClass
類別,以及包含visual Basic中Shared
static
Example
類別 ThreadProc
方法。
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()
*/
open System
open System.Threading
// TestClass derives from MarshalByRefObject, so it can be marshaled
// across application domain boundaries.
type TestClass() =
inherit MarshalByRefObject()
member _.UnloadCurrentDomain (state: obj) =
printfn $"\nUnloading the current AppDomain{state}."
// Unload the current application domain. This causes
// an AppDomainUnloadedException to be thrown.
//
AppDomain.Unload AppDomain.CurrentDomain
let threadProc (state: obj) =
// 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.
let ad = AppDomain.CreateDomain "TestDomain"
let tc = ad.CreateInstanceAndUnwrap("Sample", "TestClass") :?> 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
printfn "ThreadProc: This message is never displayed."
// 1. Queue ThreadProc as a task for a ThreadPool thread.
ThreadPool.QueueUserWorkItem(threadProc, " from a ThreadPool thread") |> ignore
Thread.Sleep 1000
// 2. Execute ThreadProc on an ordinary thread.
let t = Thread(ParameterizedThreadStart 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)"
with :? AppDomainUnloadedException as adue ->
printfn $"Main thread caught AppDomainUnloadedException: {adue.Message}"
// 4. Execute ThreadProc on the main thread without
// exception handling.
threadProc " from the main application thread (unhandled)"
printfn "Main: This message is never displayed."
(* 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()
*)
Imports System.Threading
Imports System.Runtime.InteropServices
Public Class Example
Public Shared Sub Main()
' 1. Queue ThreadProc as a task for a ThreadPool thread.
ThreadPool.QueueUserWorkItem(AddressOf ThreadProc, _
" from a ThreadPool thread")
Thread.Sleep(1000)
' 2. Execute ThreadProc on an ordinary thread.
Dim t As New Thread(AddressOf 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 adue As AppDomainUnloadedException
Console.WriteLine("Main thread caught AppDomainUnloadedException: {0}", _
adue.Message)
End Try
' 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.")
End Sub
Private Shared Sub ThreadProc(ByVal state As Object)
' 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.
Dim ad As AppDomain = AppDomain.CreateDomain("TestDomain")
Dim o As Object = ad.CreateInstanceAndUnwrap("Sample", "TestClass")
Dim tc As TestClass = CType(o, 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.")
End Sub
End Class
' TestClass derives from MarshalByRefObject, so it can be marshaled
' across application domain boundaries.
'
Public Class TestClass
Inherits MarshalByRefObject
Public Sub UnloadCurrentDomain(ByVal state As Object)
Console.WriteLine(vbLf & "Unloading the current AppDomain{0}.", state)
' Unload the current application domain. This causes
' an AppDomainUnloadedException to be thrown.
'
AppDomain.Unload(AppDomain.CurrentDomain)
End Sub
End Class
' 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 namespace System;
using namespace System::Reflection;
using namespace System::Security::Policy;
//for evidence Object*
int 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: {0}", AppDomain::CurrentDomain->FriendlyName );
Console::WriteLine( "child domain: {0}", 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: {0}", domain->FriendlyName );
}
catch ( AppDomainUnloadedException^ /*e*/ )
{
Console::WriteLine( "The appdomain MyDomain does not exist." );
}
}
using System;
using System.Reflection;
using System.Security.Policy;
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.");
}
}
}
open System
//Create evidence for the new appdomain.
let adevidence = AppDomain.CurrentDomain.Evidence
// Create the new application domain.
let domain = AppDomain.CreateDomain("MyDomain", adevidence)
printfn $"Host domain: {AppDomain.CurrentDomain.FriendlyName}"
printfn $"child domain: {domain.FriendlyName}"
// Unload the application domain.
AppDomain.Unload domain
try
printfn ""
// Note that the following statement creates an exception because the domain no longer exists.
printfn $"child domain: {domain.FriendlyName}"
with :? AppDomainUnloadedException ->
printfn "The appdomain MyDomain does not exist."
Imports System.Reflection
Imports System.Security.Policy
Class ADUnload
Public Shared Sub Main()
'Create evidence for the new appdomain.
Dim adevidence As Evidence = AppDomain.CurrentDomain.Evidence
' Create the new application domain.
Dim domain As AppDomain = 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 e As AppDomainUnloadedException
Console.WriteLine("The appdomain MyDomain does not exist.")
End Try
End Sub
End Class
備註
在 .NET Framework 2.0 版中,未在使用者程式代碼中處理的 AppDomainUnloadedException 具有下列效果:
如果線程已在Managed程式代碼中啟動,則會終止。 不允許未處理的例外狀況終止應用程式。
如果工作在 ThreadPool 線程上執行,則會終止工作,並將線程傳回至線程集區。 不允許未處理的例外狀況終止應用程式。
如果線程在 Unmanaged 程式代碼中啟動,例如主要應用程式線程,則會終止。 允許未處理的例外狀況繼續,而操作系統會終止應用程式。
AppDomainUnloadedException 會使用具有值0x80131014的 HRESULT COR_E_APPDOMAINUNLOADED。
如需 AppDomainUnloadedException實例的初始屬性值清單,請參閱 AppDomainUnloadedException 建構函式。
建構函式
AppDomainUnloadedException() |
初始化 AppDomainUnloadedException 類別的新實例。 |
AppDomainUnloadedException(SerializationInfo, StreamingContext) |
已淘汰.
使用串行化數據,初始化 AppDomainUnloadedException 類別的新實例。 |
AppDomainUnloadedException(String, Exception) |
使用指定的錯誤訊息和造成這個例外狀況的內部例外狀況參考,初始化 AppDomainUnloadedException 類別的新實例。 |
AppDomainUnloadedException(String) |
使用指定的錯誤訊息,初始化 AppDomainUnloadedException 類別的新實例。 |
屬性
Data |
取得索引鍵/值組的集合,提供例外狀況的其他使用者定義資訊。 (繼承來源 Exception) |
HelpLink |
取得或設定與這個例外狀況相關聯的說明檔連結。 (繼承來源 Exception) |
HResult |
取得或設定 HRESULT,這是指派給特定例外狀況的編碼數值。 (繼承來源 Exception) |
InnerException |
取得造成目前例外狀況的 Exception 實例。 (繼承來源 Exception) |
Message |
取得描述目前例外狀況的訊息。 (繼承來源 Exception) |
Source |
取得或設定造成錯誤之應用程式或物件的名稱。 (繼承來源 Exception) |
StackTrace |
取得呼叫堆疊上即時框架的字串表示。 (繼承來源 Exception) |
TargetSite |
取得擲回目前例外狀況的方法。 (繼承來源 Exception) |
方法
Equals(Object) |
判斷指定的物件是否等於目前的物件。 (繼承來源 Object) |
GetBaseException() |
在衍生類別中覆寫時,傳回 Exception,這是一或多個後續例外狀況的根本原因。 (繼承來源 Exception) |
GetHashCode() |
做為預設哈希函式。 (繼承來源 Object) |
GetObjectData(SerializationInfo, StreamingContext) |
已淘汰.
在衍生類別中覆寫時,使用例外狀況的相關信息來設定 SerializationInfo。 (繼承來源 Exception) |
GetType() |
取得目前實例的運行時間類型。 (繼承來源 Exception) |
MemberwiseClone() |
建立目前 Object的淺層複本。 (繼承來源 Object) |
ToString() |
建立並傳回目前例外狀況的字串表示。 (繼承來源 Exception) |
事件
SerializeObjectState |
已淘汰.
發生於例外狀況串行化以建立例外狀況狀態物件,其中包含例外狀況的串行化數據。 (繼承來源 Exception) |