22.1 CLR寄宿服务器
22.2 AppDomain函数
22.3 卸载AppDomain测试
22.4 监视AppDomian线程
22.5 AppDomain FirstChance异常通知设计
22.6 宿主如何使用AppDomain代理
22.7 高级宿主控制调试
.NET Framework在Windows平台顶部运行。这意味着.NET Framework必须用Windows能理解的技术来构建。首先,全部托管模块和程序集文件都必须使用Windows PE文件格式,并且要么是Windows EXE文件,要么是DLL文件。对象
开发CLR时,Microsoft实际是把它实现成包含在一个DLL中的COM服务器。也就是说,Microsoft为CLR定义了一个标准的COM接口,并为该接口和COM服务器分配了GUID。安装.NET Framework时,表明CLR的COM服务器和其余COM服务器同样在Windows注册表中注册。接口
任何Windows应用程序都能寄宿(容纳)CLR。但不要经过调用CoCreateInstance来建立CLR COM服务器实例,相反,你的非托管宿主应该调用MetaHost.h文件中声明的CLRCreateInstance函数。进程
宿主应用程序可调用ICLRRuntimeHost接口定义的方法:
设置宿主管理器。告诉CLR宿主向参与涉及如下操做的决策:内存分配,线程调度/同步以及程序集加载。宿主还可声明它想得到有关垃圾回收启动和中止以及特定操做超时的通知
获取CLR管理。告诉CLR阻止使用某些类/成员。另外,宿主能分辨哪些代码能够调试,哪些不能够,以及当特定事件(例如AppDomain卸载,CLR中止或这堆栈溢出异常)发生时宿主应调用哪一个方法。
初始化并启动CLR
加载程序集并执行其中的代码
中止CLR,阻止任何更多的托管代码在Windows进程中运行。
CLR COM服务器初始化时会建立一个AppDomain。AppDomain是一组程序集的逻辑容器。CLR初始化时建立的第一个AppDomain称为“默认AppDomain”,这个默认的AppDomain只有在Windows进程终止时才会被销毁。
除了默认AppDomain,正在使用非托管COM接口方法或托管类型方法的宿主还可要求CLR建立额外的AppDomain。AppDomain是为了提供隔离而设计的。具体功能:
一个AppDomain的代码不能直接访问另外一个AppDomain的代码建立的对象。一个AppDomain中的代码要访问另外一个AppDomain中的对象,只能使用“按引用封送”或者“按值封送”的语义。
AppDomain能够卸载
AppDomain能够单独保护
AppDomain能够单独配置
跨越AppDomain边界访问对象
1.CLR挂起进程中执行过托管代码的全部线程。
2.CLR检查全部线程,查看哪些线程正在执行要卸载的App Domain中的代码,或者哪些线程会在某个时候返回至要卸载的AppDomain。
3.当第2步发现的全部线程都离开AppDomain后,CLR遍历堆,为引用了“由已卸载的AppDomain建立的对象”的每一个代理对象都设置一个标志。
4.CLR强制垃圾回收,回收由已卸载的AppDomain建立的任何对象的内存。
5.CLR恢复剩余全部线程的执行。
宿主应用程序可监视AppDomain消耗的资源。
每一个AppDomain均可关联一组回调方法:CLR开始查找AppDomain中的catch块时,这些回调方法将得以调用。
CLR处理异常:异常首次抛出时,CLR调用向抛出异常的AppDomain登记的全部FirstChanceException回调方法。而后,CLR查找栈上在同一个AppDomain中的任何catch块。有一个catch块能处理异常,则异常处理完成,将继续正常执行。若是AppDomian中没有一个catch块能处理异常,则CLR沿着栈向上来到调用AppDomain,再次抛出同一个异常对象。
6.1 可执行应用程序
自寄宿应用程序,它们都有托管EXE文件。Windows用托管文件初始化进程时,会加载垫片。垫片检查应用程序的程序集中的CLR头信息。头信息指明了生成和测试应用程序时使用的CLR版本
。垫片根据这些信息决定将哪一个版本的CLR加载到进程中,CLR加载并初始化好以后,会再次检查程序集的CLR头,判断哪一个方法是应用程序的入口方。CLR调用该方法。
代码运行时会访问其余类型,引用另外一个程序集的类型时,CLR会定位所须要的程序集,并将其加载到同一个AppDomian中。应用程序的Main方法返回后,Windows进程终止(销毁默认AppDomain和其余全部AppDomain)。
6.2 Microsoft Silverlight富Internet应用程序
6.3 Microsoft ASP.NET 和XML Web服务应用程序
ASP.NET做为一个ISPAPI(APSNet_ISAPI.dll)实现。客户端首次请求由这个DLL处理URL时,ASP.NET会加载CLR。客户端请求一个Web应用程序,ASP.NET判断这是否是第一次请求。若是是,ASP.NET要求CLR为该Web应用程序建立新AppDomain;每一个Web应用程序都根据虚拟根目录来标志。而后,ASP.NET要求CLR将包含应用程序所公开类型的程序集加载到新AppDomain中,建立该类型的实列,并调用其中的方法响应客户端的Web请求。若是代码引用了更多的类型,CLR将所须要的程序集加载到Web应用程序的AppDomain中。
6.4 Microsoft SQL Server
6.5 更多的用法只局限于想象力
7.1使用托管代码管理CLR
7.2 写健壮的宿主应用程序
托管代码出现错误时,宿主可告诉CLR采起什么行动:
若是线程执行时间过长,CLR可终止线程并返回一个响应。
CLR可卸载App Domain。
CLR可被禁用。
CLR可退出Windows进程。
CLR能够得体地或者粗鲁地终止线程或AppDomain。
7.3 宿主如何拿回它的线程