.NET 應用程序域?


爲了提升windows系統的穩定性與可靠性,windows通過進程來實現。所有的可執行代碼、數據以及其他資源都被包含在進程中,
不允許其他進程對它進行訪問(除非有足夠的權限)。對於.NET應用程序,還進一步引入另一種隔離機制AppDomain。
CLR加載的時候將創建三個AppDomain:系統應用程序域、共享應用程序域以及默認應用程序域。使用WinDbg.exe和!dumpdomain
命令可以看到CLR創建的應用程序域如下:
0:000> .loadby sos.dll clr
0:000> !dumpdomain
*********************************************************************
* Symbols can not be loaded because symbol path is not initialized. *
* *
* The Symbol Path can be set by: *
* using the _NT_SYMBOL_PATH environment variable. *
* using the -y <symbol_path> argument when starting the debugger. *
* using .sympath and .sympath+ *
*********************************************************************
PDB symbol for clr.dll not loaded
--------------------------------------
System Domain: 50820f60
LowFrequencyHeap: 50821284
HighFrequencyHeap: 508212cc
StubHeap: 50821314
Stage: OPEN
Name: None
--------------------------------------
Shared Domain: 50820c08
LowFrequencyHeap: 50821284
HighFrequencyHeap: 508212cc
StubHeap: 50821314
Stage: OPEN
Name: None
Assembly: 00726b38 [C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader: 0072a3b8
Module Name
79571000 C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

--------------------------------------
Domain 1: 006d7000
LowFrequencyHeap: 006d7454
HighFrequencyHeap: 006d749c
StubHeap: 006d74e4
Stage: OPEN
Name: CApp.exe
Assembly: 00726b38 [C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader: 0072a3b8
SecurityDescriptor: 00726aa0
Module Name
=79571000 C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

在進程中有三個應用程序域:System、Shared、Domain 1。這個三個程序域的主要作用:
1、系統應用程序員
1)創建其他兩個應用程序域(共享應用程序域和默認應用程序域)
2)將mscorlib.dll加載到共享應用程序域中
3)記錄進程中所有其他的應用程序域,包括提供加載/卸載應用程序域等功能
4)記錄字符串池中的字符串常量,因此允許任意字符串在每個進程中都存在一個副本。
5)初始化特定類型的異常,例如內存耗盡異常等
2、共享應用程序域
在共享應用程序域中包含與應用程序域無關的代碼。mscorlib.dll將被加載到應用程序域中,
此外還包含在System命名空間中的一些基本類型。

3、默認應用程序域
.NET程序在默認應用程序域中運行。位於默認應用程序域中的所有代碼都只有在這個域纔是有效的。
任何跨域應用程序域的訪問操作都必須通過.NET遠程對象來進行。

 

宿主如何使用AppDomain?
1、可執行應用程序
控制檯UI應用程序、NT Service應用程序、windows窗體應用程序和 WPF應用程序都是自寄宿應用程序的例子。
它們都有託管EXE文件。
2、ASP.NET web窗體和web應用程序
ASP.NET作爲一個ISAPI DLL(ASPNet_ISAPI.dll)實現。客戶端首次請求一個由ASP.NET ISAPI DLL處理的URL時,
ASP.NET會加載CLR。客戶端請求一個web應用程序時,ASP.NET判斷這是不是第一次請求。
如果是,ASP.NET會告訴CLR爲該WEB應用程序創建一個新的AppDomain。每個web應用程序都按照它的虛擬根目錄來標識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章