第六节:宿主如何使用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母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...
随机推荐
- html 去掉input 获取焦点时的边框
html中,当input标签获取焦点的时候(例如,当光标放在input框中准备输入值时), input标签外围会出现边框,有的时候我们需要去掉这个边框,可以使用css的outline:none;属性将 ...
- 业务gis 怎么让别的开发人员不需要懂gis就可以搞开发? (五)
我们稍微搭建了一个比较简单的图形使用模板,flex端操作这里我就不说了,按大家喜好写,最后javascript部分可以通过jsduck工具生成一个开发文档给业务开发人员,前提注释部分要写好,要公开的注 ...
- Flash与IE奇怪的关键字冲突
我有一个小小的swf文件,用来播放声音,加入到HTML后,在Firefox/chrome下播放正常,唯独IE8提示 消息: 对象不支持此属性或方法 行: 48 字符: 3 代码: 0 URI: ... ...
- 慕课网-安卓工程师初养成-4-2 Java条件语句之 if...else
来源:http://www.imooc.com/code/1354 if...else 语句的操作比 if 语句多了一步: 当条件成立时,则执行 if 部分的代码块: 条件不成立时,则进入 else ...
- 【练习】显示MySQLadmin 库户籍选项
[oracle@enmo ~]$ mysqladmin -V mysqladmin Ver , for Linux on x86_64
- 【MVC】关于Action返回结果类型的事儿(上)
一. ASP.NET MVC 1.0 Result 几何? Action的返回值类型到底有几个?咱们来数数看. ASP.NET MVC 1.0 目前一共提供了以下十几种Action返回结果类型: 1. ...
- JS常用的设计模式(13)——组合模式
组合模式又叫部分-整体模式,它将所有对象组合成树形结构.使得用户只需要操作最上层的接口,就可以对所有成员做相同的操作. 一个再好不过的例子就是jquery对象,大家都知道1个jquery对象其实是一组 ...
- 【C++面试】常考题复习
// CPP_Test@2014.10.22.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <assert.h&g ...
- 重装linux后
root帐号解禁vi /etc/pam.d/gdmvi /etc/pam.d/gdm-passwd 两个装机必备软件源http://download1.rpmfusion.org/nonfree/fe ...
- MVC 项目 在前台使用DataTable
1:后台控制器代码 //CreateTestOutputDataHeader生成一个测试DataTable public ActionResult UseDataTable() { DataTable ...