第六节:宿主如何使用AppDomain
前面已经讨论了宿主以及宿主加载CLR的方式。同时还讨论了宿主如何告诉CLR创建和卸载AppDomain。为了使这些讨论更加具体,下面将描述一些常见的宿主和AppDomain使用情形。特别地,我要解释不同应用程序类型如何宿主CLR,以及他们如何管理AppDomain。
1 可执行应用程序
控制台UI应用程序、NT Service应用程序、Windows窗体应用程序和WPF应用程序都是自宿主应用程序的例子,他们都有托管的EXE文件。Windows用一个托管EXE文件初始化一个进程时,会加载垫片。垫片会检查包含在应用程序的程序集中的CLR头信息。头信息指明生成和测试应用程序时使用的CLR的版本。垫片根据这个信息决定将哪个版本的CLR加载到进程中,CLR加载并初始化好之后,它会检查程序集的CLR头,判断应用程序的入口方法是哪个(Main)。CLR调用这个方法。在这个时候,应用程序会真正启动并运行。
代码运行时,它会访问其他类型。引用另一个程序集中的类型时,CLR会定为所需程序集,并把它加载到同一个AppDomain中。应用程序的Main方法返回后,Windows进程终止(销毁默认AppDomain和其他所有AppDomain).
注意:顺便说一句,如果想关闭Window进程(包括它的所有AppDomain),可调用System.Environment的静态方法Exit,该方法时终止进程最得体的方式,因为它首先调用托管堆上的所有对象的Finalize方法,然后释放由CLR持有的所有非托管COM对象。最后,Exit调用Win32的ExitProcess函数。
应用程序可告诉CLR在进程的地址空间中创建额外的AppDomain。
2.Silverlight富Internet应用程序
Microsift的Silverlight”运行时”技术采用了和.NET FrameWork的普通桌面版本有所区别的一个特殊CLR。安装好Silverlight”运行时”之后,每次访问使用了Silverlight技术的一个网站,都会造成Silverlight CLR(CoreClr.dll)加载到浏览器中(这可能是、也可能不是IE-甚至不一定是一台Windows机器)。网页上的每个Silverlight控件都在它自己的AppDomain中运行。用户关闭一个标签页,或切换至另一个网站时,不再使用的任何Silverlight控件的AppDomain都会卸载。AppDomain中的Silverlight代码在一个安全性受到限制的沙箱中运行,不会以任何方式对用户或机器造成损害
3.ASP.NET Web窗体和XML Web服务器应用程序
ASP.NET 作为一个ISAPI DLL(ASPNet_ISAPI.dll)实现。客户首次请求一个由ASP.NET ISAPI DLL处理的URL时,ASP.NET会加载CLR。客户端请求一个Web应用程序时,ASP.NET判断这是不是第一次请求。如果是,ASP.NET会告诉CLR为该Web应用程序创建一个新的AppDomain每个Web应用程序都按照它的虚拟根目录来标识。然后,ASP.NET指示CLR将包含了“应用程序所公开的类型”的程序集加载到新AppDomain中,创建该类型的一个实例,并调用其中的方法响应客户端的Web请求。如果代码引用了更多类型,CLR会将所需的程序集加载到Web应用程序的AppDomain中。
未来的客户端请求一个已开始运行的Web应用程序时,ASP.NET不再创建AppDomain;相反,它会使用现在AppDomain,创建Web应用程序的类型的一个新实例,并开始调用方法。这些方法已JIT编译成本地代码,所以后续客户端请求的处理性能将会比较出色。
如果客户端请求一个不同Web应用程序,ASP.NET会告诉CLR创建一个新AppDomain。新AppDomain通常在和其他AppDomain一样的工作进程中创建。这意味着许多Web应用程序在同一个Window进程中运行,这提升了整体系统的总体效率。同样地,每个Web应用程序需要的程序集都会加载到一个单独的AppDomain中,这个AppDomain唯一的目的就是讲Web应用程序的代码和其他Web应用程序隔离。
ASP.NET的另一个出色的功能就是可以在不关闭Web服务器的前提下动态更改网站的代码。网站的文件在硬盘上发生改动时,ASP.NET会检测到这个情况,并卸载包含旧版本文件的AppDomain,并创建一个新AppDomain,向其中加载新版本的文件。为了确保这个过程的顺利进行,ASP.NET 使用了AppDomain的一个名为”影像复制”的功能。
4. Sql Server
Microsoft SQL Server是一个非托管的应用程序,因为它的大部分代码仍是用非托管C++写的。Sql Server允许开发人员通过托管代码创建存储过程。首次请求数据库运行一个用托管代码写的存储过程时,SQL SERVER会加载CLR。存储过程在它们自己的安全AppDomain中运行,这避免了存储过程对数据库服务器产生负面影响。
这其实是一项非同寻常的功能!这意味着开发人员可以选择自己喜欢的编程语言来编写存储过程。存储过程可以在自己的代码中使用强类型的数据对象。代码还会被JIT编译成本地代码,而不是采用解析执行的方式。开发人员可利用FCL或任何其他程序集定义的任何类型。结果是我们的工作边的越来越轻松,但应用程序执行的越来越好。
5. 更多的用法只局限于你自己的想象力
生产性应用程序(比如字处理软件和电子表格软件)也允许用户使用任何编程语言来编写宏。宏可以访问与CLR一起运行的所有程序集和类型。这些宏将被编译,因为他们执行的更快。而且最重要的是,这些宏将在一个安全AppDomain中运行,避免对任何用户产生不利影响。你自己的应用程序也可利用这个功能。具体怎么用,只局限于你自己的想象力。
第六节:宿主如何使用AppDomain的更多相关文章
- 基于Extjs的web表单设计器 第六节——界面框架设计
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
- 第一百二十六节,JavaScript,XPath操作xml节点
第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...
- VUE2.0实现购物车和地址选配功能学习第六节
第六节 地址列表过滤和展开所有的地址 html:<li v-for="(item,index) in filterAddress">js: new Vue({ el:' ...
- delphi 线程教学第六节:TList与泛型
第六节: TList 与泛型 TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本) ...
- 第十六节、基于ORB的特征检测和特征匹配
之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...
- 第四百一十六节,Tensorflow简介与安装
第四百一十六节,Tensorflow简介与安装 TensorFlow是什么 Tensorflow是一个Google开发的第二代机器学习系统,克服了第一代系统DistBelief仅能开发神经网络算法.难 ...
- 第四百零六节,自定义用户表类来继承Django的用户表类,
第四百零六节,自定义用户表类来继承Django的用户表类, models.py from django.db import models # Create your models here. from ...
- 第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件
第三百九十六节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,自定义列表页上传插件 设置后台列表页面字段统计 在当前APP里的adminx.py文件里的数据表管理器里设置 ag ...
- 《Linux内核分析》 第六节 进程的描述和进程的创建
<Linux内核分析> 第六节 进程的描述和进程的创建 20135307 张嘉琪 原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study ...
- 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承
第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...
随机推荐
- Oracle逻辑读详解
1.物理读(physical read) 当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 了 以下是例子: 1.1 第一次 ...
- HQL: Hibernate查询语言
HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可 ...
- Hadoop JobHistory
hadoop jobhistory记录下已运行完的MapReduce作业信息并存放在指定的HDFS目录下,默认情况下是没有启动的,需要配置完后手工启动服务. mapred-site.xml添加如下配置 ...
- 1307: City Tour
1307: City Tour Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description Alic ...
- 【HTTP】POST 与 PUT 方法区别
1. POST 用于向服务端发送数据,常用于表单数据提交: PUT 用于向服务器上的资源(如文件)中存储数据: 2. 302 303 307 状态码区别 他们都是重定向(临时重定向 p.s 301 ...
- <关于数据仓库>基于docker的Mysql与Hadoop/Hive之间的数据转移 (使用Apache Sqoop™)
原创博客,转载请联系博主! 摘要:本文介绍了如何使用docker快速搭建一个可以从外部访问的mysql服务容器,和由docker搭建的分布式Hadoop文件系统,并且使用ApacheSqoop完成将m ...
- Django中级篇之Model专题
ORM 就是用面向对象的方式去操作数据库的创建表以及增删改查等操作 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据 ...
- 虚拟内存和swap分区的关系
首先,这两个概念分别对应windows和linux,即:windows:虚拟内存linux:swap分区 windows即使物理内存没有用完也会去用到虚拟内存,而Linux不一样 Linux只有当物理 ...
- javascript代码复用模式
代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承.在javascript中,并没有类的概念,所以代码的复用,也并不局限于类式继承.javascript中创建对象的方法很多,有构 ...
- cacti yum快速部署
简述:本来是编译安装的,由于编译过程中库文件关联太多,安装文件一定要有顺序性,报错太多,到了rrdtool这一步说什么都安装不过去了,由于时间问 题,选择了yum安装,对于编译安装,这个要简单多了,她 ...