.Net AppDomain詳解(二)
AppDomain 類
表示應用程序域,它是一個應用程序在其中執行的獨立環境。 此類不能被繼承。
命名空間: System
程序集: mscorlib(位於 mscorlib.dll)
??System.MarshalByRefObject
????System.AppDomain
[ClassInterfaceAttribute(ClassInterfaceType.None)] [ComVisibleAttribute(true)] public sealed class AppDomain : MarshalByRefObject, _AppDomain, IEvidenceFactory屬性
名稱 | 說明 |
---|---|
ActivationContext |
獲取當前應用程序域的激活上下文。 |
ApplicationIdentity |
獲得應用程序域中的應用程序標識。 |
ApplicationTrust |
獲取說明授予應用程序的權限以及應用程序是否擁有允許其運行的信任級別的信息。 |
BaseDirectory |
獲取基目錄,它由程序集沖突解決程序用來探測程序集。 |
CurrentDomain |
獲取當前 Thread 的當前應用程序域。 |
DomainManager |
獲得初始化應用程序域時主機提供的域管理器。 |
DynamicDirectory |
獲取目錄,它由程序集沖突解決程序用來探測動態創建的程序集。 |
Evidence |
獲取與該應用程序域關聯的 Evidence。 |
FriendlyName |
獲取此應用程序域的友好名稱。 |
Id |
獲得一個整數,該整數唯一標識進程中的應用程序域。 |
IsFullyTrusted |
獲取一個值,該值指示加載到當前應用程序域的程序集是否是以完全信任方式執行的。 |
IsHomogenous |
獲取一個值,該值指示當前應用程序域是否擁有一個為加載到該應用程序域的所有程序集授予的權限集。 |
MonitoringIsEnabled |
獲取或設置一個值,該值指示是否對當前進程啟用應用程序域的 CPU 和內存監視。 一旦對進程啟用了監視,則無法將其禁用。 |
MonitoringSurvivedMemorySize |
獲取上次回收後保留下來的,已知由當前應用程序域引用的字節數。 |
MonitoringSurvivedProcessMemorySize |
獲取進程中所有應用程序域的上次回收後保留下來的總字節數。 |
MonitoringTotalAllocatedMemorySize |
獲取自從創建應用程序域後由應用程序域進行的所有內存分配的總大小(以字節為單位,不扣除已回收的內存)。 |
MonitoringTotalProcessorTime |
獲取自從進程啟動後所有線程在當前應用程序域中執行時所使用的總處理器時間。 |
PermissionSet |
獲取沙盒應用程序域的權限集。 |
RelativeSearchPath |
獲取基目錄下的路徑,在此程序集沖突解決程序應探測專用程序集。 |
SetupInformation |
獲取此實例的應用程序域配置信息。 |
ShadowCopyFiles |
獲取應用程序域是否配置為影像副本文件的指示。 |
名稱 | 說明 |
---|---|
AppendPrivatePath(String) |
已過時。 將指定的目錄名追加到專用路徑列表。 |
ApplyPolicy(String) |
返回應用策略後的程序集顯示名稱。 |
ClearPrivatePath() |
已過時。 將指定專用程序集位置的路徑重置為空字符串 ("")。 |
ClearShadowCopyPath() |
已過時。 將包含影像復制的程序集的目錄列表重置為空字符串 ("")。 |
CreateComInstanceFrom(String,?String) |
創建指定 COM 類型的新實例。 形參指定文件的名稱,該文件包含含有類型和類型名稱的程序集。 |
CreateComInstanceFrom(String,?String,?Byte[],?AssemblyHashAlgorithm) |
創建指定 COM 類型的新實例。 形參指定文件的名稱,該文件包含含有類型和類型名稱的程序集。 |
CreateDomain(String) |
使用指定的名稱新建應用程序域。 |
CreateDomain(String,?Evidence) |
使用所提供的證據創建具有給定名稱的新應用程序域。 |
CreateDomain(String,?Evidence,?AppDomainSetup) |
使用指定的名稱、證據和應用程序域設置信息創建新的應用程序域。 |
CreateDomain(String,?Evidence,?AppDomainSetup,?PermissionSet,?StrongName[]) |
使用指定的名稱、證據、應用程序域設置信息、默認權限集和一組完全受信任的程序集創建新的應用程序域。 |
CreateDomain(String,?Evidence,?String,?String,?Boolean) |
使用證據、應用程序基路徑、相對搜索路徑和指定是否向應用程序域中加載程序集的影像副本的形參創建具有給定名稱的新應用程序域。 |
CreateDomain(String,?Evidence,?String,?String,?Boolean,?AppDomainInitializer,?String[]) |
使用證據、應用程序基路徑、相對搜索路徑和指定是否向應用程序域中加載程序集的影像副本的形參創建具有給定名稱的新應用程序域。 指定在初始化應用程序域時調用的回調方法,以及傳遞回調方法的字符串實參數組。 |
CreateInstance(String,?String) |
創建在指定程序集中定義的指定類型的新實例。 |
CreateInstance(String,?String,?Object[]) |
創建在指定程序集中定義的指定類型的新實例。 形參指定激活特性數組。 |
CreateInstanceAndUnwrap(String,?String) |
創建指定類型的新實例。 形參指定定義類型的程序集以及類型的名稱。 |
CreateInstanceAndUnwrap(String,?String,?Object[]) |
創建指定類型的新實例。 形參指定定義類型的程序集、類型的名稱和激活特性的數組。 |
CreateInstanceFrom(String,?String) |
創建在指定程序集文件中定義的指定類型的新實例。 |
CreateInstanceFrom(String,?String,?Boolean,?BindingFlags,?Binder,?Object[],?CultureInfo,?Object[]) |
創建在指定程序集文件中定義的指定類型的新實例。 |
CreateInstanceFrom(String,?String,?Boolean,?BindingFlags,?Binder,?Object[],?CultureInfo,?Object[],?Evidence) |
已過時。 創建在指定程序集文件中定義的指定類型的新實例。 |
CreateInstanceFrom(String,?String,?Object[]) |
創建在指定程序集文件中定義的指定類型的新實例。 |
CreateInstanceFromAndUnwrap(String,?String) |
創建在指定程序集文件中定義的指定類型的新實例。 |
CreateInstanceFromAndUnwrap(String,?String,?Boolean,?BindingFlags,?Binder,?Object[],?CultureInfo,?Object[]) |
創建在指定的程序集文件中定義的指定類型的新實例,指定是否忽略類型名稱的大小寫,並指定綁定特性和用於選擇要創建的類型的聯編程序、構造函數的自變量、區域性以及激活特性。 |
CreateInstanceFromAndUnwrap(String,?String,?Boolean,?BindingFlags,?Binder,?Object[],?CultureInfo,?Object[],?Evidence) |
已過時。 創建在指定程序集文件中定義的指定類型的新實例。 |
CreateInstanceFromAndUnwrap(String,?String,?Object[]) |
創建在指定程序集文件中定義的指定類型的新實例。 |
CreateObjRef(Type) |
創建包含所有生成代理用於與遠程對象進行通信所需的相關信息的對象。(繼承自 MarshalByRefObject。) |
ExecuteAssembly(String,?String[]) |
使用指定的自變量執行指定文件中包含的程序集。 |
ExecuteAssembly(String,?String[],?Byte[],?AssemblyHashAlgorithm) |
使用指定的自變量、哈希值和哈希算法執行指定文件中包含的程序集。 |
ExecuteAssemblyByName(AssemblyName,?Evidence,?String[]) |
已過時。 根據給定的 AssemblyName 使用指定的證據和實參執行程序集。 |
ExecuteAssemblyByName(AssemblyName,?String[]) |
根據給定的 AssemblyName 使用指定的參數執行程序集。 |
ExecuteAssemblyByName(String) |
在給定其顯示名稱的情況下執行程序集。 |
ExecuteAssemblyByName(String,?String[]) |
在給定顯示名稱的情況下,使用指定自變量執行程序集。 |
GetAssemblies() |
獲取已加載到此應用程序域的執行上下文中的程序集。 |
GetData(String) |
為指定名稱獲取存儲在當前應用程序域中的值。 |
GetHashCode() |
作為默認哈希函數。(繼承自 Object。) |
GetLifetimeService() |
檢索當前生存期服務對象,用於控制此實例的生存期策略。(繼承自 MarshalByRefObject。) |
GetType() |
獲取當前實例的類型。 |
InitializeLifetimeService() |
通過防止創建租約來給予 AppDomain 無限生存期。(覆蓋 MarshalByRefObject.InitializeLifetimeService()。) |
IsCompatibilitySwitchSet(String) |
獲取可以為 null 的布爾值,該值指示是否設置了任何兼容性開關,如果已設置,則指定是否設置了指定的兼容性開關。 |
IsDefaultAppDomain() |
返回一個值,指示應用程序域是否是進程的默認應用程序域。 |
IsFinalizingForUnload() |
指示此應用程序域是否正在卸載以及公共語言運行時是否正在終止該域包含的對象。 |
Load(AssemblyName) |
在給定 AssemblyName 的情況下加載 Assembly。 |
Load(Byte[]) |
加載帶有基於通用對象文件格式 (COFF) 的圖像的 Assembly,該圖像包含已發出的 Assembly。 |
Load(Byte[],?Byte[]) |
加載帶有基於通用對象文件格式 (COFF) 的圖像的Assembly,該圖像包含已發出的 Assembly。 還加載表示 Assembly 的符號的原始字節。 |
Load(String) |
在給定其顯示名稱的情況下加載 Assembly。 |
ReflectionOnlyGetAssemblies() |
返回已加載到應用程序域的只反射上下文中的程序集。 |
SetData(String,?Object) |
為指定的應用程序域屬性分配指定值。 |
SetData(String,?Object,?IPermission) |
將指定值分配給指定應用程序域屬性,檢索該屬性時要求調用方具有指定權限。 |
SetPrincipalPolicy(PrincipalPolicy) |
指定在此應用程序域中執行時如果線程嘗試綁定到用戶,用戶和標識對象應如何附加到該線程。 |
SetThreadPrincipal(IPrincipal) |
設置在以下情況下要附加到線程的默認主體對象,即當線程在此應用程序域中執行時,如果線程嘗試綁定到主體這種情況。 |
ToString() |
獲取一個字符串表示,包含應用程序域友好名稱和任意上下文策略。(覆蓋 Object.ToString()。) |
Unload(AppDomain) |
卸載指定的應用程序域。 |
名稱 | 說明 |
---|---|
AssemblyLoad |
在加載程序集時發生。 |
AssemblyResolve |
在對程序集的解析失敗時發生。 |
DomainUnload |
在即將卸載 AppDomain 時發生。 |
FirstChanceException |
當托管代碼拋出異常時發生,在運行時在調用堆棧中搜索應用程序域中的異常處理程序之前。 |
ProcessExit |
當默認應用程序域的父進程退出時發生。 |
ReflectionOnlyAssemblyResolve |
當程序集的解析在僅限反射的上下文中失敗時發生。 |
ResourceResolve |
當資源解析因資源不是程序集中的有效鏈接資源或嵌入資源而失敗時發生。 |
TypeResolve |
在對類型的解析失敗時發生。 |
UnhandledException |
當某個異常未被捕獲時出現。 |
應用程序域,由表示AppDomain對象,幫助提供有關執行托管的代碼的隔離、 卸載和安全邊界。
-
使用應用程序域隔離可能會終止進程的任務。 如果狀態AppDomain,正在執行的任務變得不穩定,AppDomain可以而不會影響進程中卸載。 進程必須運行很長一段無需重新啟動時,這很重要。 你還可以使用應用程序域隔離不應共享數據的任務。
-
如果程序集被加載到默認應用程序域,它無法從內存中卸載過程運行時。 但是,如果您打開第二個應用程序域加載和執行程序集,程序集是卸載卸載該應用程序域時。 使用此方法最大程度減少偶爾使用大型 Dll 的長時間運行進程的工作集。
多個應用程序域可以運行在一個進程中;但是,沒有應用程序域和線程之間的一對一的相關性。 多個線程可以屬於單個應用程序域,並且單個應用程序域中時的給定的線程並不局限於單個應用程序域,在任何給定時間,執行線程。
使用創建應用程序域CreateDomain方法。 AppDomain實例用於加載和執行程序集 (Assembly)。 當AppDomain是不再在使用中,可以將它卸載。
AppDomain類實現的一組啟用應用程序進行響應時加載的程序集,應用程序域將被卸載,或引發未經處理的異常時的事件。
有關使用應用程序域的詳細信息,請參閱應用程序域。
此類實現MarshalByRefObject, _AppDomain,和IEvidenceFactory接口。
決不要創建的遠程操作包裝AppDomain對象。 這樣可以將發布到的遠程引用AppDomain,如公開方法CreateInstance與遠程訪問和有效地銷毀該的代碼訪問安全性AppDomain。 惡意客戶端連接到遠程AppDomain無法獲取任何資源的訪問權限AppDomain本身具有訪問權限。 不創建任何擴展的類型的遠程操作包裝MarshalByRefObject並實現惡意客戶端無法用於繞過安全系統的方法。
小心 |
---|
默認值為AppDomainSetup.DisallowCodeDownload屬性是false。 此設置是不安全的服務。 若要防止服務下載部分受信任的代碼,請將此屬性設置為true。 |
此示例演示如何創建一個新AppDomain,新實例化中的一個類型AppDomain,以及與該類型的對象通信。 此外,此示例演示如何卸載AppDomain導致要進行垃圾回收的對象。
using System; using System.Reflection; using System.Threading; class Module1 { public static void Main() { // Get and display the friendly name of the default AppDomain. string callingDomainName = Thread.GetDomain().FriendlyName; Console.WriteLine(callingDomainName); // Get and display the full name of the EXE assembly. string exeAssembly = Assembly.GetEntryAssembly().FullName; Console.WriteLine(exeAssembly); // Construct and initialize settings for a second AppDomain. AppDomainSetup ads = new AppDomainSetup(); ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; ads.DisallowBindingRedirects = false; ads.DisallowCodeDownload = true; ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; // Create the second AppDomain. AppDomain ad2 = AppDomain.CreateDomain("AD #2", null, ads); // Create an instance of MarshalbyRefType in the second AppDomain. // A proxy to the object is returned. MarshalByRefType mbrt = (MarshalByRefType) ad2.CreateInstanceAndUnwrap( exeAssembly, typeof(MarshalByRefType).FullName ); // Call a method on the object via the proxy, passing the // default AppDomain‘s friendly name in as a parameter. mbrt.SomeMethod(callingDomainName); // Unload the second AppDomain. This deletes its object and // invalidates the proxy object. AppDomain.Unload(ad2); try { // Call the method again. Note that this time it fails // because the second AppDomain was unloaded. mbrt.SomeMethod(callingDomainName); Console.WriteLine("Sucessful call."); } catch(AppDomainUnloadedException) { Console.WriteLine("Failed call; this is expected."); } } } // Because this class is derived from MarshalByRefObject, a proxy // to a MarshalByRefType object can be returned across an AppDomain // boundary. public class MarshalByRefType : MarshalByRefObject { // Call this method via a proxy. public void SomeMethod(string callingDomainName) { // Get this AppDomain‘s settings and display some of them. AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation; Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}", ads.ApplicationName, ads.ApplicationBase, ads.ConfigurationFile ); // Display the name of the calling AppDomain and the name // of the second domain. // NOTE: The application‘s thread has transitioned between // AppDomains. Console.WriteLine("Calling from ‘{0}‘ to ‘{1}‘.", callingDomainName, Thread.GetDomain().FriendlyName ); } } /* This code produces output similar to the following: AppDomainX.exe AppDomainX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null AppName=, AppBase=C:\AppDomain\bin, ConfigFile=C:\AppDomain\bin\AppDomainX.exe.config Calling from ‘AppDomainX.exe‘ to ‘AD #2‘. Failed call; this is expected. */
此類型的所有公共靜態(Visual Basic 中的 已共享 在 Visual Basic 中)成員都是線程安全的。不保證所有實例成員都是線程安全的。
更多: .Net AppDomain詳解(一)C#如何測試代碼運行時間
C# 訪問操作註冊表整理
.Net AppDomain詳解(二)