22.1 CLR寄宿
22.2 AppDomain
22.3 卸载AppDomain
22.4 监视AppDomian
22.5 AppDomain FirstChance异常通知
22.6 宿主如何使用AppDomain
22.7 高级宿主控制
22.1 CLR寄宿
.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进程中运行。
22.2 AppDomain
CLR COM服务器初始化时会创建一个AppDomain。AppDomain是一组程序集的逻辑容器。CLR初始化时创建的第一个AppDomain称为“默认AppDomain”,这个默认的AppDomain只有在Windows进程终止时才会被销毁。
除了默认AppDomain,正在使用非托管COM接口方法或托管类型方法的宿主还可要求CLR创建额外的AppDomain。AppDomain是为了提供隔离而设计的。具体功能:
一个AppDomain的代码不能直接访问另一个AppDomain的代码创建的对象。一个AppDomain中的代码要访问另一个AppDomain中的对象,只能使用“按引用封送”或者“按值封送”的语义。
AppDomain可以卸载
AppDomain可以单独保护
AppDomain可以单独配置
跨越AppDomain边界访问对象
22.3 卸载AppDomain
1.CLR挂起进程中执行过托管代码的所有线程。
2.CLR检查所有线程,查看哪些线程正在执行要卸载的App Domain中的代码,或者哪些线程会在某个时候返回至要卸载的AppDomain。
3.当第2步发现的所有线程都离开AppDomain后,CLR遍历堆,为引用了“由已卸载的AppDomain创建的对象”的每个代理对象都设置一个标志。
4.CLR强制垃圾回收,回收由已卸载的AppDomain创建的任何对象的内存。
5.CLR恢复剩余所有线程的执行。
22.4 监视AppDomian
宿主应用程序可监视AppDomain消耗的资源。
22.5 AppDomain FirstChance异常通知
每个AppDomain都可关联一组回调方法:CLR开始查找AppDomain中的catch块时,这些回调方法将得以调用。
CLR处理异常:异常首次抛出时,CLR调用向抛出异常的AppDomain登记的所有FirstChanceException回调方法。然后,CLR查找栈上在同一个AppDomain中的任何catch块。有一个catch块能处理异常,则异常处理完成,将继续正常执行。如果AppDomian中没有一个catch块能处理异常,则CLR沿着栈向上来到调用AppDomain,再次抛出同一个异常对象。
22.6 宿主如何使用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 更多的用法只局限于想象力
22.7 高级宿主控制
7.1使用托管代码管理CLR
7.2 写健壮的宿主应用程序
托管代码出现错误时,宿主可告诉CLR采取什么行动:
如果线程执行时间过长,CLR可终止线程并返回一个响应。
CLR可卸载App Domain。
CLR可被禁用。
CLR可退出Windows进程。
CLR可以得体地或者粗鲁地终止线程或AppDomain。
7.3 宿主如何拿回它的线程