首页 > 代码库 > CLR寄宿和AppDomain

CLR寄宿和AppDomain

一、CLR寄宿

.net framework在windows平台的顶部允许。者意味着.net framework必须用windows能理解的技术来构建。所有托管模块和程序集文件必须使用windows PE文件格式,而且要么是windows exe文件,要么是DLL文件

1,MSCorEE.dll(垫片)
①CLRCreateInstance函数在MSCorEE.dll文件中实现。“垫片”的工作是决定创建哪个版本的CLR(1.0、2.0、3.0的CLR代码在MSCorWks.dll文件中;版本4则在Clr.dll文件中)

②CLRCreateInstance函数可返回一个ICLRMetaHost接口。宿主应用程序可调用这个接口的GetRuntime函数,指定宿主要创建的CLR版本。然后,垫片将所需版本的CLR加载到宿主的进程中


2,ICLRRuntimeHost可以做以下事情
①设置宿主管理器。该诉CLR宿主想参与与涉及以下操作的决策:内存分配、线程调度/同步以及程序集加载等。宿主还可声明它想获得有关垃圾回收启动和停止以及特定操作超时的通知
②获取CLR管理器。告诉CLR阻止使用某些类/成员。另外,宿主能分辨哪些代码可以调试,哪些不可以,以及当特定事件(例如AppDomain卸载、CLR停止或者堆栈移除异常)发生时宿主应调用哪个方法
③初始化并启动CLR
④加载程序集并执行其中的代码
⑤停止CLR,阻止任何更多的托管代码在Windows进程中运行

 技术分享

二、AppDomain

CLR COM服务器初始化时会创建一个AppDomain。AppDomain是一组程序集的逻辑容器。CLR初始化时创建的第一个AppDomain称为“默认AppDomain”,这个默认的AppDomain只有在Windows进程终止时才会被销毁

1,AppDomain的具体功能
①一个AppDomain的代码不能直接访问另一个AppDomain的代码创建的对象。
一个AppDomain中的代码创建了一个对象后,该对象便被该AppDomain“拥有”。换言之,它的生存期不能超过创建它的代码所有的AppDomain。一个AppDomain中的代码要访问另一个AppDomain的对象,只能使用“按引用封送”或者“按值封送”的予以。这就强制建立了清晰的分割和边界,因为一个AppDomain中的代码不能直接引用另一个AppDomain中的代码创建的对象。这种隔离使AppDomain能很容易地从进程中卸载,不会影响其他AppDomain正在运行的代码
②AppDomain可以卸载
CLR不支持从AppDomain中卸载特定的程序集,但可以告诉CLR卸载一个AppDomain,从而卸载该AppDomain当前包含的所有程序集
③AppDomain可以单独保护
AppDomain创建后会应用一个权限集,它决定了想这个AppDomain中运行的程序集授予最大权限,正是由于存在这样的权限,所以当宿主加载一些代码后,可以保证这些代码不会破坏(或读取)宿主本身使用的一些重要数据结构
④AppDomain可以单独配置
AppDomain创建后会关联一组配置设置。这些设置主要影响CLR在AppDomain中加载程序集的方式,设计搜索路径、版本绑定重定向、卷影复制以及加载器优化

2,Windows进程

技术分享

中立的AppDomain:

MSCorLib.dll包含了System.Object,System.Int32以及其他所有与.NET Framework密不可分的类型

该Loader堆中的所有类型对象,以及为这些类型定义的JIT编译生成的所有本机代码,都会由进程中的所有AppDomain共享

该中立的AppDomain不能被卸载,除非终止windows进程

 

CLR寄宿和AppDomain