.net托管世界的应用程序域与线程
【程序编程相关:C++/CLI会冲击C#吗?】关键词:托管 宿主 公用语言运行库 应用程序域 程序集 线程 【推荐阅读:使滚动条到屏幕左侧,不影响正文】
一. 引子 【扩展信息:推荐C++教程(ZT)】
managed host clr(common language runtime) appdomain assembly thread .net框架提供了全新的计算平台,给出了一致性的面向对象的编程环境,解决了安全.版本控制等原来系统平台中存在的问题,通过公用语言运行库(clr)提供了一个高效.安全的程序执行环境,也就是托管(也称作受控,managed)环境.在这个类似虚拟机环境下,我们编写的程序是如何运行.如何“托管”的呢?这个托管的世界如何同非托管的世界相互联系呢?二. 如何进入“托管”世界
首先,我们要了解,到目前为止,还没有“纯天然的”.net执行环境(不排除类似java芯片的.net芯片将来会有),所谓托管的环境(clr)需要运行在当前已存非托管的系统上.要进入托管的.net世界,需要有一个称为宿主(host)的程序为将要运行的.net托管代码准备执行环境—也就是要加载.net世界的基础clr.在目前的windows系统上,能够担负这个重任的有3类已存程序: 1. shell(通常是explorer),提供从用户桌面启动.net程序,创建一个进程,启动此进程建立clr 2. 浏览器宿主(internet explorer),处理从web下载的.net代码执行. 3. 服务器宿主(如iis的辅助进程aspnet_wp.exe) 在执行任何托管代码之前,宿主必须首先加载并初始化公共语言运行库.假设一个.net可执行程序(prj1.exe)从shell启动,操作系统会首先建立一个进程,也就是宿主进程.装载的程序文件包括了在执行配置信息与执行代码,代码入口通常会被(创建此.net应用程序的编译器)放置一个 stub,这个stub实际上就是一个6字节的本机代码: jmp _corexemain 而_corexemain是从外部库mscoree.dll导出,由prj1.exe引入的函数,于是操作系统会装入mscoree.dll(进入.net世界的序曲),修正_corexemain的运形时实际位置. mscoree.dll实际上是一个com组件库.调用_corexemain后开始初始化clr,并察看prj1.exe的clr相关数据结构,确定执行.net托管代码的入口.宿主调用.net 支持api corbindtoruntimeex来装载clr,并且根据配置初始化clr的运行特征,譬如垃圾回收策略等,这是因为不同的宿主面临的应用需求不一样,一个服务宿主同普通的工作站宿主的“垃圾回收”(gc)机制显然不一样,所以启动clr时的参数也不一样. 宿主装载的是一个符合com规范要求的组件库文件mscoree.dll,也就是clr,一般存在于操作系统目录(便于装载).有关mscoree.dll更多的了解,建议可看看frameworksdk目录中的头文件mscoree.h.... 下一页