启动CLR
前面提到在SSCLI环境里运行.NET程序的时候,执行的命令类似java程序的执行过程,即通过clix程序解释执行.net程序。这个过程看起来跟在windows环境下执行.net程序表面上看起来不一样 – Windows环境下的CLR直接执行.net程序文件即可执行,其实内部运作机制是一样的,在后文我会讲解到。
首先我们先来解读下clix的源码,其源码位置位于:clr\src\tools\clix\clix.cpp,入口的main函数在clix.cpp:157行。
刚开始的159 ~ 266行都是执行命令行参数解析以及错误处理的代码,主要分三大块,162 ~ 166行的目的是判断rotor_palrt和sscoree两个dll库文件是否在进程中加载了,rotor_palrt这个库文件在后面解读平台抽象层(PAL)的时候会提到,而sscoree这个库文件的作用跟CLR里面的mscoree.dll的作用是一致的,即用来加载正确的CLR版本。如将要执行的.net程序是在.net 4.0下面编译的,则加载.net 4.0的clr,如果运行的是.net 2.0的程序,则加载2.0的clr。sscoree加载CLR的过程是通过几个导出函数实现的,而clix程序严重依赖这几个函数加载clr和准备.net程序运行环境,这一点我们将在后面看到。
168 ~ 176的代码是一个条件编译代码,启用时,clix在运行.net程序之前让调试器有机会附加到进程上。
177 ~ 266的代码纯粹就是命令行参数处理,其目的就是将命令行里运行参数传递给将要执行的.net程序。如在命令行执行:clix.exe dotNetApp.exe param1 param2;命令行传递给clix的参数列表param1, param2其实是传给要执行的.net程序dotNetApp.exe的,因此177 ~ 266这段代码的目的就是做这件事情。
267行这段代码是整个main函数里最核心的代码,其执行Launch函数实际加载clr和准备.net运行环境,而Launch函数也是通过在147行调用_CorExeMain2函数完成这项工作的。_CorExeMain2就是sscoree.dll的导出函数,这一点可以用dumpbin命令查看:
cd sscli20
cd binaries.x86dbg.rotor
dumpbin /exports sscoree.dll

_CorExeMain2函数的源码位于:\clr\src\vm\ceemain.cpp:1622。_CorExeMain2函数只做两件事情,在1646行调用CoInitializeEE确保进程中加载了CLR执行引擎;真正加载.net程序并执行的工作在1659行调用ExecuteEXE完成,而ExecuteEXE最后调用SystemDomain::ExecuteMainMethod完成这项工作。SystemDomain::ExecuteMainMethod的源码位于 \clr\src\vm\appdomain.cpp:2099行。
跟大部分SSCLI源码类似,函数的前后两块代码都是一些条件判断和扫尾操作代码,从2121行开始,SystemDomain::ExecuteMainMethod依次执行如下操作:
1、从2121行开始,确保虚拟机是在system domain里运行的;
2、2133行加载将要执行的.net程序 – 即assembly;
3、2134行分析assembly里的IL格式,确保是一个合法的.net程序;
4、2138 ~ 2143行找到assembly的入口函数点;
5、2148 ~ 2154行为.net程序创建默认的应用程序域(Application Domain);
6、2155 ~ 2168行为.net程序准备寻找依赖Assembly的环境;
7、2168行加载.net程序以及其依赖的Assembly进入当前进程;
8、2169 ~ 2184行为新创建的应用程序域设置一个友好的名字,以便在调试过程中容易识别;
9、2194行执行.net程序的main函数,进入托管执行环境。
启动CLR的更多相关文章
- .NET框架源码解读之启动CLR
前面提到在SSCLI环境里运行.NET程序的时候,执行的命令类似java程序的执行过程,即通过clix程序解释执行.net程序.这个过程看起来跟在windows环境下执行.net程序表面上看起来不一样 ...
- CLR via C# 摘要一:托管程序的执行模型
托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...
- unsafe clr sql 部署向导
1.部署安全权限的简单的程序集,非常简单,只需要正常发布就行,基本可以成功,前提是账号有部署clr assembly的权限 第一步: 创建登陆账号,尽量不要使用sa吧,默认架构为:dbo即可 第二部: ...
- CLR via C#(01)-.NET平台下代码是怎么跑起来的
1. 源代码编译为托管模块 程序在.NET框架下运行,首先要将源代码编译为托管模块.CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言.微软开发了多种语言的编译器,编译 ...
- CLR 初步
1. 源代码编译为托管模块 程序在.NET框架下运行,首先要将源代码编译为 托管模块.CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言.微软开发了多种语言的编译器,编 ...
- 有关CLR的初学小整理(可能理解不深刻,望大牛指出)
1. .Net程序通过CLR去加载运行管理代码, 加载CLR的进程成为“宿主”,通常操作系统加载. 加载CLR的进程也可以为某个DLL,也成为“宿主” 2. 宿主接口使宿主能够对运行库的更多方面进行控 ...
- Use CLR Profiler
Use CLR Profiler 第一次翻译对我而言比较长的E文,有很多不足之处,请见谅.(个人的习惯GC又做了名词又做了名词) 原文:http://msdn.microsoft.com/en-us/ ...
- 关于ASP.NET与CLR相互关系的一些总结
原文地址:http://www.cnblogs.com/jasenkin/archive/2010/10/20/asp-net-clr-relation.html CLR(COM服务器) CLR作为一 ...
- 第一节:CLR寄宿
本系列文章来自 CLR VIA C# .NET FrameWork在Microsoft Windows平台的顶部运行.这意味着.NET必须用Windows可以理解的技术来构建.首先,所有的托管模块和 ...
随机推荐
- ASP.NET MVC 混搭 ASP.NET WebForms 所导致的 Html.ActionLink/BeginForm 问题
首先,需要了解下这篇博文:<ASP.NET WebForms MapPageRoute 路由配置> 之前,在 ASP.NET MVC 中混搭 ASP.NET WebForms,使用 Map ...
- make things simple
以前看过一篇文章,具体内容不记得了,只记得它的结论了:懒是人类进步的源动力.当时觉得结论有点新颖,文中列举了大量的实例证明这个结论,其中重点强调了计算机学科.我本身从事算是计算机相关的工作,对文中的部 ...
- 清除inline-block元素之间的空白
一个元素如果被设置为display:inline-block,那么这个元素将表现为行内块的性质.被设为行内块的元素 对内(子元素)表现为块级框,具体为可以设置高度宽度,可以设置垂直margin和pad ...
- Oracle段收缩功能
1.了解段收缩 2.自动执行Segment Advisor 3.收缩段 1. 了解段收缩 应用场景:如果对一张表频繁执行插入.更新和删除操作,时间长了可能会出现大量碎片,Oracle针对这种场景推出段 ...
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)
在OpenCV2:图像的几何变换,平移.镜像.缩放.旋转(1)主要介绍了图像变换中的向前映射.向后映射.处理变换过程中浮点坐标像素值的插值算法,并且基于OpenCV2实现了两个简单的几何变换:平移和镜 ...
- 7.2 数据注解属性--TimeStamp特性【Code-First 系列】
TimeStamp特性可以应用到领域类中,只有一个字节数组的属性上面,这个特性,给列设定的是tiemStamp类型.在并发的检查中,Code-First会自动使用这个TimeStamp类型的字段. 下 ...
- Rafy 领域实体框架演示(2) - 新功能展示
本文的演示需要先完成上一篇文章中的演示:<Rafy 领域实体框架示例(1) - 转换传统三层应用程序>.在完成改造传统的三层系统之后,本文将讲解使用 Rafy 实体框架后带来的一些常用功能 ...
- Windows 7 Python 3.5 及 django 1.8 的安装
本文参考:http://www.runoob.com/django/django-first-app.html 1.下载 安装 python 3.5 可以自定义安装位置 ,勾选设置环境变量Path 默 ...
- appach2.4 + php7 +mysql5.7.14 配置
步骤1.首先打开Apache2.2\conf里面的httpd.conf文件.在里面找到: ServerRoot ,改成Appache所在目录 步骤二 在LoadModule 后面添加支持php7的扩 ...
- SOA实践之基于服务总线的设计
在上文中,主要介绍了SOA的概念,什么叫做“服务”,“服务”应该具备哪些特性.本篇中,我将介绍SOA的一种很常见的设计实践--基于服务总线的设计. 基于服务总线的设计 基于总线的设计,借鉴了计算机内部 ...