前面提到在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函数,进入托管执行环境。

最新文章

  1. Virtualbox 虚拟机支持硬件摄像头
  2. 新版的tomcat里面get请求通过http协议的时候似乎默认是UTF-8的编码了吗?
  3. swift 基于SDK8.0 获取当前时间
  4. OSGI框架学习
  5. Redis常用命令手册:服务器相关命令
  6. Uploadify 3.2 参数属性、事件、方法函数详解
  7. BIEE Setup
  8. 玩转Android之MVVM开发模式实战,炫酷的DataBinding!
  9. poj 3294 Life Forms
  10. sql 学习之 group by 及 聚合函数
  11. Java访问kafka的时候java.nio.channels.ClosedChannelException解决办法
  12. Oracle EBS-SQL (SYS-21):sys_用户名与人员对应关系查询.sql
  13. Android:ViewPager04
  14. 解决安装WordPress主题及插件需要输入FTP问题
  15. Java集合总结系列2:Collection接口
  16. undo表空间
  17. Exif格式分析
  18. C++面试基础之回调
  19. [tem]最长上升子序列
  20. MySQL解压版的安装与配置

热门文章

  1. [C#]读文件
  2. 6.1课堂笔记—DML(数据操作语言),DQL查询语句
  3. 新手之:SpringBoot ——Reids主从哨兵整合(CentOS7)
  4. 关于常见的协议BSD,APACHE,MIT,GPL的理解
  5. MPI 派生数据类型 MPI_Type_create_struct(),MPI_Type_contiguous(),MPI_Type_vector(),MPI_Type_create_hvector(),MPI_Type_indexed()
  6. 利用CSS3 filter:drop-shadow实现纯CSS改变图片颜色
  7. Configure、中间件与ErrorHandlingMiddleware全局异常捕获
  8. 10-SSH综合案例:前台用户模块:邮箱服务器配置
  9. Windows NT
  10. Ubuntu切换阿里源