第一节:CLR寄宿
本系列文章来自 CLR VIA C#
.NET FrameWork在Microsoft Windows平台的顶部运行。这意味着.NET必须用Windows可以理解的技术来构建。首先,所有的托管模块和程序集文件都必须使用Windows PE文件格式,而且要么是一个Windows.exe文件,要么是一个DLL文件。
开发CLR时,Microsoft实际是将它实现成包含在一个DLL中的COM服务器。也就是说,Microsoft为CLR定义了一个标志的COM接口,并为该接口和COM服务器分配了GUID(全局通用标识符)。安装.NET FrameWork时,代表CLR的COM服务器和其它COM服务器一样在WINDOW注册表中注册。如果想了解这方面更多的信息,可参考.NET Framework SDK一起发布的C++头文件MetaHost.h。该头文件中定义了GUID和非托管ICLRMetaHost接口。
任何Window应用程序都可以寄宿CLR。但是,不要通过调用CoCreateInstance来创建CLR COM服务器的实例,相反,你的非托管宿主应该调用MetaHost.h文件中声明的CLRCreateInstance函数。CLRCreateInstance函数是在MSCorEE.dll文件中实现的,该文件一般在C:\Windows\System32目录中。这个DLL被人们称为“垫片(shim)”,它的工作决定创建那个版本的CLR;注意垫片本身并不包含CLR COM服务器。
一台机器可安装多个版本的CLR,但只有一个版本的MSCorEE.dll文件(只限于X86架构下)。机器上安装的MSCorEE.dll版本是与机器上安装最新的CLR一起发布的那个版本。因此,该版本的MSCorEE.dll知道如何查找机器上可能安装的以前的版本的CLR。
包含实际CLR代码的文件的名称在不同版本的CLR中是不同的。对于1.0,1.1和2.0版本,CLR代码实在一个名为MSCorWks.dll的文件中;对于4.0版本,CLR代码在一个名为Clr.dll的文件中。由于一个机器上可能安装多个版本的CLR,所以这些文件安装到不同的目录中。
版本1.0 C:\Windows\Microsoft.NET\Framework\v1.0.3705
版本 2.1 C:\Windows\Microsoft.NET\Framework\v1.1.4322
版本2.0 C:\Windows\Microsoft.NET\Framework\v2.0.50727
版本 4.0 C:\Windows\Microsoft.NET\Framework\v4.0.30319
CLRCreateInstance函数可以返回一个ICLRMetaHost接口。宿主应用程序可调用这个接口的GetRuntime函数,指定宿主要创建的CLR的版本。然后,垫片将所需版本的CLR加载到宿主的进程中。
默认情况下,当一个托管的可执行文件启动时,垫片会检查可执行文件,提取当初生成和测试应用程序时使用的CLR的版本信息。但是,应用程序可在它的XML文件中设置requiredRuntime和supportedRuntime这两项来覆盖默认行为。
GetRuntime函数返回指向一个非托管接口ICLRRuntimeInfo的指针。有了这个指针后,就可以利用GetInterface方法获得ICLRRuntimeHost接口了。宿主应用程序可调用这个接口的方法来做下面的事情:
- 设置宿主管理器。告诉CLR,宿主想参与涉及以下操作的决策:内存分配、线程调度/同步以及程序集加载等。宿主还可声明它想获得有关垃圾回收启动和停止以及特定操作超时的通知。
- 获取CLR管理器。告诉CLR阻止使用某些类/成员。另外,宿主能分辨哪些代码可以调试,哪些代码不能,以及当一个特定时间发生时宿主应调用哪些方法。
- 初始化并启动CLR。
- 加载程序集并执行其中的代码。
- 停止CLR,阻止任何更多的托管代码在Windows进程中运行。
注意:当然,Window进程完全可以不加载CLR。只有需要在进程中执行托管代码时,才需要加载它。在CLR 4.0以前,一个Windows进程只允许加载CLR的一个实例。换言之,在一个进程中,要么不包含任何CLR,要么 包含CLR V1.0,CLR V1.1 或者CLR 2.0之一。只允许每个进程包含一个CLR版本之一项巨大的限制。例如,这样一来,Microsift office outlook便不能加载为不同版本的.NET Framework生成和测试项的两个加载项。
但是,随着.NET Framework 4.0的发布,Microsoft支持在一个Windows进程中同时加载CLR V2.0和V4.0,允许为.NET Framework 2.0和4.0写得不同组件同时运行,不会造成任何兼容性问题。
一个CLR加载到一个Windows进程中之后,便永远不能卸载;调用ICLRRuntimeHost接口上的AddRef和Release方法时没有作用的,CLR从进程中卸载的唯一方法就是终止进程,这造成Window清理进程使用的所有资源,包括CLR在内。
有许多原因可以解释寄宿CLR为何很有用。寄宿使任何应用程序都能提供CLR功能和可编程性,而且至少一部分能用托管代码来写。如果开发人员想扩展一个应用程序,寄宿CLR能提供多方面的好处,下面总结一部分好处。
- 可以用任何编程语言来编写。
- 代码在JIT编译后执行,所以速度很快
- 代码使用垃圾回收避免内存泄露和损坏。
- 代码在一个安全的沙箱中运行。
- 宿主不必提供一个丰富的开发环境。宿主利用现有的技术,包括语言、编译器、编辑器、调试器、profiler等。
第一节:CLR寄宿的更多相关文章
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- android内部培训视频_第一节
声明:本视频为公司内部做android培训时录制的,无任何商业目的.同时鉴于水平有限,可能不符合您的需求,放在这里的目的是提供给公司同事下载,作为培训的一个记录,也作为一个系列教程的自我督促完成的理由 ...
- 我的第一节Android课
我的第一节安卓课程,今天非比寻常的一天,我开始了我程序猿之路的第一节安卓课程,安卓课程只是我的一个兴趣班,我的本专业是java开发,因为喜欢做一个属于自己的一个手机APP,就选多个一样技能,毕竟十八般 ...
- Clr Via C#读书笔记---CLR寄宿和应用程序域
#1 CLR寄宿: 开发CLR时,Microsoft实际是将他实现成包含在一个dll中的COM服务器.Microsoft为CLR定义了一个标准的COM接口,并为该接口和COM服务器分配了GUID.安装 ...
- 第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触
http://blog.csdn.net/visioncat/article/details/1596576 GCC for Win32 开发环境介绍(5) 第四章 跨平台图像显示库——SDL 第一节 ...
- Centos7 Openstack - (第一节)基本环境配置
Centos7 install Openstack - (第一节)基本环境配置 我的blog地址:http://www.cnblogs.com/caoguo 根据openstack官方文档配置 官方文 ...
- 第一部分 CLR基础:第3章 共享程序集和强命名程序集
第一部分 CLR基础:第3章 共享程序集和强命名程序集
- seajs第一节,seajs基本使用
什么是seajs,它是干什么使用的,可以去网上搜索一下, 官网:http://seajs.org/docs/ 基本使用seajs <!DOCTYPE html> <html> ...
- 第二十二章 CLR寄宿和AppDomain
1. 概念解析 CLR Hosting(CLR 宿主):初始启动.Net Application时,Windows进程的执行和初始化跟传统的Win32程序是一样的,执行的还是非托管代码,只不过由于PE ...
- 2014年度辛星html教程夏季版第一节
从今天起开始在博客园开启自己的html教程啦,先从第一节开始把,首先推荐一个网站,就是http:/www.w3cschool.cc,这是一个公开的教学网站,但是它有一个问题,那就是虽然很全面,但是不是 ...
随机推荐
- image onclick
onclick="this.src+='?rand='+Math.random();" style="cursor: pointer; vertical-align: ...
- php 深入理解addslashes函数
php addslashes函数对于很多人来说并不陌生,但很大部分人只是了解皮毛,只知道addslashes函数是在特定字符前面加上反斜杠,本文章将带大家深入理解php addslashes函数的使用 ...
- MySQL数据库优化技术之数据库表的设计
三范式介绍表的范式:只有符合的第一范式,才能满足第二范式,进一步才能满足第三范式. 1. 第一范式:表的列具有原子性,不可再分解.只要是关系型数据库都自动满足第一范式.数据库的分类:关系型数据库:My ...
- 1738 - TWO NODES
1738 - TWO NODES 时间限制: 10000 MS 内存限制: 65535 KB 问题描述 Suppose that G is an undirected graph, and the v ...
- 【caffe-windows】 caffe-master 之 cifar10 超详细
本教程尽量详细,大多步骤都有图,如果运行出错,请先对照自己的文件是否和图上的一样,包括标点啊,空格啊,斜杠,反斜杠啊之类的小细节. 本例程是在 win10 64位 caffe-master ...
- Android开发-API指南-<uses-configuration>
<uses-configuration> 英文原文:http://developer.android.com/guide/topics/manifest/uses-configuratio ...
- Android开发-API指南-Intent和Intent过滤器
Intents and Intent Filters 英文原文:http://developer.android.com/guide/components/intents-filters.html 采 ...
- Laxcus大数据管理系统2.0(9)- 第七章 分布任务组件
第七章 分布任务组件 Laxcus 2.0版本的分布任务组件,是在1.x版本的基础上,重新整合中间件和分布计算技术,按照新增加的功能,设计的一套新的.分布状态下运行的数据计算组件和数据构建组件,以及依 ...
- Linux 串口使用
1. 安装串口调试工具minicom sudo apt-get install minicom 2. 查看串口端口 cfm@cfm880:~$ dmesg | grep tty[ 0.000000] ...
- Android基础总结(12)——XML和JSON解析
XML和JSON解析 在网络上传输数据时最常用的格式有两种:XML和JSON.本文主要就是学习如何对这两种常用的数据格式进行解析. 1.XML和JSON的定义 XML:扩展标记语言 (Extensib ...