AppDomainUnloadedException Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wyjątek zgłaszany podczas próby uzyskania dostępu do niezaładowanej domeny aplikacji.
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
- Dziedziczenie
- Atrybuty
Przykłady
Ten rozdział zawiera dwa przykłady kodu. W pierwszym przykładzie pokazano wpływ elementu AppDomainUnloadedException na różne wątki, a drugi — zwalnianie domeny podstawowej aplikacji.
Przykład 1
Poniższy przykład kodu definiuje klasęTestClass
, którą można marshalingować przez granice domeny aplikacji i klasę Example
zawierającą metodę static
(Shared
w Visual Basic). ThreadProc
Metoda ThreadProc
tworzy domenę aplikacji, tworzy TestClass
obiekt w domenie i wywołuje metodęTestClass
, która zwalnia domenę wykonującą, powodując .AppDomainUnloadedException
Metoda TestClass
jest wykonywana bez obsługi wyjątków z wątku ThreadPool i ze zwykłego wątku, co pokazuje, że nieobsługiwany wyjątek kończy zadanie lub wątek, ale nie aplikację. Następnie jest wykonywany z obsługą wyjątków i bez wyjątku z głównego wątku aplikacji, co pokazuje, że kończy aplikację, jeśli nie jest obsługiwana.
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()
'
Przykład 2
Poniższy przykład kodu tworzy i zwalnia domenę aplikacji i pokazuje, że AppDomainUnloadedException element jest zgłaszany podczas kolejnej próby uzyskania dostępu do niezaładowanej domeny.
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
Uwagi
W .NET Framework w wersji 2.0 AppDomainUnloadedException kod użytkownika nie jest obsługiwany w kodzie użytkownika:
Jeśli wątek został uruchomiony w kodzie zarządzanym, zostanie on zakończony. Nieobsługiwany wyjątek nie może zakończyć działania aplikacji.
Jeśli zadanie jest wykonywane w wątku ThreadPool , zostanie zakończone, a wątek zostanie zwrócony do puli wątków. Nieobsługiwany wyjątek nie może zakończyć działania aplikacji.
Jeśli wątek uruchomiony w kodzie niezarządzanym, takim jak główny wątek aplikacji, zostanie zakończony. Nieobsługiwany wyjątek może być kontynuowany, a system operacyjny kończy działanie aplikacji.
AppDomainUnloadedException używa COR_E_APPDOMAINUNLOADED HRESULT, która ma wartość 0x80131014.
Aby uzyskać listę początkowych wartości właściwości dla wystąpienia AppDomainUnloadedExceptionprogramu , zobacz AppDomainUnloadedException konstruktory.
Konstruktory
AppDomainUnloadedException() |
Inicjuje nowe wystąpienie klasy AppDomainUnloadedException. |
AppDomainUnloadedException(SerializationInfo, StreamingContext) |
Inicjuje nowe wystąpienie klasy AppDomainUnloadedException z zserializowanymi danymi. |
AppDomainUnloadedException(String) |
Inicjuje AppDomainUnloadedException nowe wystąpienie klasy z określonym komunikatem o błędzie. |
AppDomainUnloadedException(String, Exception) |
Inicjuje nowe wystąpienie AppDomainUnloadedException klasy z określonym komunikatem o błędzie i odwołaniem do wyjątku wewnętrznego, który jest przyczyną tego wyjątku. |
Właściwości
Data |
Pobiera kolekcję par klucz/wartość, które zapewniają dodatkowe informacje zdefiniowane przez użytkownika dotyczące wyjątku. (Odziedziczone po Exception) |
HelpLink |
Pobiera lub ustawia link do pliku pomocy skojarzonego z tym wyjątkiem. (Odziedziczone po Exception) |
HResult |
Pobiera lub ustawia HRESULT, zakodowaną wartość liczbową przypisaną do określonego wyjątku. (Odziedziczone po Exception) |
InnerException |
Exception Pobiera wystąpienie, które spowodowało bieżący wyjątek. (Odziedziczone po Exception) |
Message |
Pobiera komunikat opisujący bieżący wyjątek. (Odziedziczone po Exception) |
Source |
Pobiera lub ustawia nazwę aplikacji lub obiektu, który powoduje błąd. (Odziedziczone po Exception) |
StackTrace |
Pobiera reprezentację ciągu natychmiastowych ramek w stosie wywołań. (Odziedziczone po Exception) |
TargetSite |
Pobiera metodę, która zgłasza bieżący wyjątek. (Odziedziczone po Exception) |
Metody
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
GetBaseException() |
Po przesłonięciu w klasie pochodnej funkcja zwraca Exception główną przyczynę co najmniej jednego kolejnego wyjątku. (Odziedziczone po Exception) |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Po zastąpieniu w klasie pochodnej ustawia SerializationInfo element z informacjami o wyjątku. (Odziedziczone po Exception) |
GetType() |
Pobiera typ środowiska uruchomieniowego bieżącego wystąpienia. (Odziedziczone po Exception) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
ToString() |
Tworzy i zwraca reprezentację ciągu bieżącego wyjątku. (Odziedziczone po Exception) |
Zdarzenia
SerializeObjectState |
Nieaktualne.
Występuje, gdy wyjątek jest serializowany w celu utworzenia obiektu stanu wyjątku zawierającego serializowane dane o wyjątku. (Odziedziczone po Exception) |