第一节: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接口了。宿主应用程序可调用这个接口的方法来做下面的事情:

  1. 设置宿主管理器。告诉CLR,宿主想参与涉及以下操作的决策:内存分配、线程调度/同步以及程序集加载等。宿主还可声明它想获得有关垃圾回收启动和停止以及特定操作超时的通知。
  2. 获取CLR管理器。告诉CLR阻止使用某些类/成员。另外,宿主能分辨哪些代码可以调试,哪些代码不能,以及当一个特定时间发生时宿主应调用哪些方法。
  3. 初始化并启动CLR。
  4. 加载程序集并执行其中的代码。
  5. 停止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能提供多方面的好处,下面总结一部分好处。

  1. 可以用任何编程语言来编写。
  2. 代码在JIT编译后执行,所以速度很快
  3. 代码使用垃圾回收避免内存泄露和损坏。
  4. 代码在一个安全的沙箱中运行。
  5. 宿主不必提供一个丰富的开发环境。宿主利用现有的技术,包括语言、编译器、编辑器、调试器、profiler等。
时间: 2024-10-14 03:48:23

第一节:CLR寄宿的相关文章

第一节 构建一个简单的WCF应用

先吐个槽,到目前为止接触的东西也就是些ado.net.select.delete.update.create.临时表的批量操作.及稍微复杂点的几个表之间查询再带几个excel导入导出 然后会点前端的js.jquery等,所以在公司目前薪水并不高(能在广州生活下去吧,什么买车买房的想都别想),拿自己身边的同志一比较感觉心里不怎么平衡,凡事还是得靠自己 自强才是硬道理,就吐到这里吧!开始我的wcf之旅吧 本人理工科类型的文笔很烂 希望各位大神不要喷小弟哦(参照的书本:WCF全面解析) 咱们还是从小学

火云开发课堂 - 《Shader从入门到精通》系列 第一节:Shader介绍与工程搭建

<Shader从入门到精通>系列在线课程 第一节:Shader介绍与工程搭建 视频地址:http://edu.csdn.net/course/detail/1441/22665?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 项目实例: 版权声明:本文为博主原创文章,未经博主允许不得转载.

CLR寄宿和AppDomain

一.CLR寄宿 .net framework在windows平台的顶部允许.者意味着.net framework必须用windows能理解的技术来构建.所有托管模块和程序集文件必须使用windows PE文件格式,而且要么是windows exe文件,要么是DLL文件 1,MSCorEE.dll(垫片)①CLRCreateInstance函数在MSCorEE.dll文件中实现."垫片"的工作是决定创建哪个版本的CLR(1.0.2.0.3.0的CLR代码在MSCorWks.dll文件中:

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一、 除夕诗词概述 二、元日诗词概述 三、 元宵诗词概述 第二节:春节古诗词拾萃

杨森翔:春节文化大观上编 第三章 春节古诗词 目录 第一节:春节诗词概述 一. 除夕诗词概述 二.元日诗词概述 三. 元宵诗词概述 第二节:春节古诗词拾萃 一.腊祭诗词 二.祭灶诗词 三.除夕诗词 四.元旦诗词 五.人日诗词 六.元宵诗词 第一节:春节古诗词概述 中国的春节,作为除旧迎新的节日,时间相当长,从年前的腊月二十三,天空中就似乎弥漫了节日的气息.这种节日的气氛,在保持传统风俗较好的地方,甚至会持续到二月二龙抬头的时候,但欢度春节的高潮,应该说是自除夕始一直到上元之夜.因此,历代歌咏和反

第一节课作业

1 C语言是在国内外广泛使用的一种计算机语言.其语言功能丰富.表达能力强.使用灵活方便.既具有高级语言的优点,又具有低级语言的许多特点,适合编写系统软件.其功能强大,不仅用在计算机上广泛用在电子,机械等方面上,而且,所有的windows,Unix,Linux,Mac,os/2,无一例外,哪一个不是C语言写的?很多新型的语言如,C++,Java,C#,J#,perl...都是衍生自C语言.掌握了C语言,可以说你就掌握了很多门语言. 学习C程序这门课一年了,这是我们学的第一门专业课,在大学里C语言不

第一节,C语言入门

1.标示符:    命名规则:    1.只能由字母.数字.下划线组成    2.不能数字开头    3.不能与关键字重名    4.严格区分大小写    命名规范:     1.起一个有意义名字     2.驼峰标示2.注释 注释: 对代码的解释说明,是写给程序看的,方面程序员之间交流 特点: 注释是不参与编译 /* 这里面可以写 */ 多行注释 // 这是一个单行注释 只有这一行是注释,只有 两个斜杠后面才是注释内容 /* */ command + / 注释或取消注释 多行注释是可以嵌套单行

MFC第一节-windows程序内部运行机制

一.窗口 设计窗口类时: 1 typedef struct _WNDCLASS{ 2 UINT style; //如水平.垂直变化是否重绘,禁用Close,检测双击 3 WNDPROC lpfnWndProc;//窗口过程函数句柄 4 int cbClsExtra;//类附加内存 5 int cbWndExtra;//窗口附加内存 6 HANDLE hInstance;//实例句柄 7 HANDLE hIcon;//图标 8 HCURSOR hCursor;//光标 9 HBRUSH hbrBa

linux基础知识第一节

用户接口: 是一种独特的应用程序,能够为用户提供启动其它应用程序的的机制 cli:命令提示符,用户输入要执行的命令即可, shell: 外壳 sh ,csh ,ksh ,   bash, zsh , tcsh gui: 通过点击操作来启动应用程序 gnome,  mainframe  大型机 多用户操作系统    多终端   终端:设备,显示器,鼠标,键盘 虚拟终端 表示:/dev/tty# ctrl-alt-f(1-6) 物理终端(控制终端)console 串行终端 伪终端 /dev/pts#

CLR via C#读书笔记 CLR寄宿和AppDomain

寄宿 寄宿是指让其他应用程序(非托管代码)使用CLR的能力,比如自己用C++开发的窗体能创建CLR实例. 托管代码也能调用非托管代码 [DllImport("kernel32.dll")] public static extern int WinExec(string exeName, int operType); 通常会调用win32 api,但是要查文档才知道怎么定义extern方法 CLR实际上被实现为COM服务器,可以通过CoCreateInstance或CLRCreateIn

VUE2.0实现购物车和地址选配功能学习第一节(来源--慕课网河畔一角)

第一节  vue知识 vue-resource:和后台交互的一个插件,实现get.post和jsonp等功能.(替代jQuery) vue特点: 1.易用:通过创建vue实例,{{}}绑定数据十分方便,如果是jQuery还要获取值,设定十分繁琐 2.灵活-渐进式 ①渲染字段:②公共头部和公共尾部做成组件:③单页面会用到:④管理组件状态,vuex⑤使用构建工具完结项目 3.高效 ①16kb min+gzip的运行大小:②超快虚拟DOM:③最省心的优化 vue基础指令介绍: 1.指令的使用: v-m