AppDomain与进程、线程、Assembly之间关系

时间:2024-11-24 15:06:20

AppDomain是CLR的运行单元,它可以加载Assembly、创建对象以及执行程序

AppDomain是CLR实现代码隔离的基本机制。AppDomain与进程、线程、Assembly之间关系

 

每一个AppDomain可以单独运行、停止;每个AppDomain有自己默认的异常处理;AppDomain与进程、线程、Assembly之间关系

 

 

一个AppDomain的运行失败不会影响到其他的AppDomain。

 

CLR在被CLR Host(windows shell or InternetExplorer or SQL Server)加载后,要创建一个默认的AppDomain,程序的入口点

(Main方法)就是在这个默认的AppDomain中执行

 

 

  1. AppDomain vs 进程

AppDomain与进程、线程、Assembly之间关系

AppDomain被创建在进程中,一个进程内可以有多个AppDomain。一个AppDomain只能属于一个进程。

 

 

二.AppDomain vs 线程

AppDomain与进程、线程、Assembly之间关系

AppDomain是个静态概念,只是限定了对象的边界;线程是个动态概念,它可以运行在不同的
AppDomain。

一个AppDomain内可以创建多个线程,但是不能限定这些线程只能在本AppDomain内执行代码。

CLR中的System.Threading.Thread对象其实是个soft thread,它并不能被操作系统识别;操作系统能识别的是hard thread。
一个soft thread只属于一个AppDomain,穿越AppDomain的是hard thread。当hard thread访问到某个AppDomain时,一个

AppDomain就会为之产生一个soft thread。

hard thread有thread local storage(TLS),这个存储区被CLR用来存储这个hard thread当前对应的AppDomain引用以及soft

thread引用。当一个hard thread穿越到另外一个AppDomain时,TLS中的这些引用也会改变。

 

 

三.AppDomain vs Assembly

Assembly是.Net程序的基本部署单元,它可以为CLR提供用于识别类型的元数据等等。Assembly不能单独执行,它必须被加载到

AppDomain中,然后由AppDomain创建程序集中的对象。
一个Assembly可以被多个AppDomain加载,一个AppDomain可以加载多个Assembly。

每个AppDomain引用到某个类型的时候需要把相应的assembly在各自的AppDomain中初始化。因此,每个AppDomain会单独保持一

个类的静态变量。