.Net 应用程序域 的作用就是建立一种逻辑上的隔离,使应用程序更加的稳定和可靠。
启动了CLR的进程至少会拥有三个应用程序域,一般程序不会显示的创建任何应用程序域。
Demo
- 简单创建一个命令行程序,子程序中新建一个程序域,编译并运行。
AppDomainSetup setUpInfo = new AppDomainSetup();
AppDomain newDomain = AppDomain.CreateDomain("My New Domain", null, setUpInfo);
Console.WriteLine("Main method complete.Press Enter");
- 打开WinDbg,把程序附加进来,运行命令
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
!dumpdomain
这样就可以把所用的应用程序域显示出来
--------------------------------------
System Domain: 000007fee04befb0
LowFrequencyHeap: 000007fee04bf528
HighFrequencyHeap: 000007fee04bf5b8
StubHeap: 000007fee04bf648
Stage: OPEN
Name: None
--------------------------------------
Shared Domain: 000007fee04be9e0
LowFrequencyHeap: 000007fee04bf528
HighFrequencyHeap: 000007fee04bf5b8
StubHeap: 000007fee04bf648
Stage: OPEN
Name: None
Assembly: 0000000000b73330 [C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader: 0000000000b701a0
Module Name
000007fede751000 C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
--------------------------------------
Domain 1: 00000000004b06c0
LowFrequencyHeap: 00000000004b0eb8
HighFrequencyHeap: 00000000004b0f48
StubHeap: 00000000004b0fd8
Stage: OPEN
SecurityDescriptor: 00000000004b3020
Name: ApplicationDomin.exe
Assembly: 0000000000b73330 [C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader: 0000000000b701a0
SecurityDescriptor: 000000000049ba40
Module Name
000007fede751000 C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Assembly: 0000000000b76fd0 [C:\Users\Jay\Documents\visual studio 2012\Projects\ConsoleApplication\ApplicationDomin\bin\Debug\ApplicationDomin.exe]
ClassLoader: 0000000000b769c0
SecurityDescriptor: 000000000049bc20
Module Name
000007fe804740c0 C:\Users\Jay\Documents\visual studio 2012\Projects\ConsoleApplication\ApplicationDomin\bin\Debug\ApplicationDomin.exe
--------------------------------------
Domain 2: 0000000000b867e0
LowFrequencyHeap: 0000000000b86fd8
HighFrequencyHeap: 0000000000b87068
StubHeap: 0000000000b870f8
Stage: OPEN
SecurityDescriptor: 0000000000b6d400
Name: My New Domain
Assembly: 0000000000b73330 [C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader: 0000000000b701a0
SecurityDescriptor: 000000000049bfe0
Module Name
000007fede751000 C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
- 在JIT编译MSIL代码的过程中,JIT需要保存与编译过程相关的数据。如生成的机器代码和方法表等。LowFrequencyHeap中包含的是一些较少被访问的数据,HighFrequencyHeap中包含的是频繁访问的数据。SubHeap则包含了CLR执行互用性调用所用的辅助数据,如COM互用性和平台互用性。
应用程序域的功能
系统应用程序域
创建共享应用程序域和默认应用程序域
将mscorlib.dll 加载到共享应用程序域中
记录其他的所有应用程序域
记录字符串池中的字符串常量,允许任意字符串在每个进程中都存在一个副本
初始化特定类型的异常,例如内存耗尽异常,栈溢出异常,执行引擎异
常
共享应用程序域
包含一些与应用程序无关的代码,mscorlib.dll 被加载进来,此外还有一些System空间的基本类型。大多数情况非用户代码会加载进来。也可以通过一些机制加载用户代码(如优化加载器)
默认应用程序域
所有的用户代码