启动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可以理解的技术来构建.首先,所有的托管模块和 ...
随机推荐
- Windows 使用 Yeoman generators 创建 ASP.NET 应用程序
上一篇:<Windows 搭建 .NET 跨平台环境并运行应用程序> 阅读目录: Install Node.js Install yeoman-generators Create ASP. ...
- 1Z0-053 争议题目解析685
1Z0-053 争议题目解析685 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 685.In your test database: -You are using Recover ...
- (二)探究本质,WebGIS前端地图显示之地图比例尺换算原理
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.没有豆浆机怎么办? 喝豆浆是我们早晨中基本必备的一环,油条豆浆,其 ...
- MVC中实现加载更多
需要实现的功能: 数据太多想初次加载部分数据,在底部加上“加载更多”按钮 点击后加载第二页数据(从数据库只取指定页数据)后接在已有数据后面(类似于android中的下拉加载更多) 每次加载时显示“正在 ...
- 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南
申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...
- 一个网站完整详细的SEO优化方案
根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...
- WebSocket in ASP.NET Core
一.WebSocket WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0 ...
- package.json for npm中依赖外部组件时常用的版本符号含义
package.json中会有dependencies定义了项目依赖的外部组件,这些外部组件的依赖都是带有版本符号以表示被依赖组件的版本范围. { "dependencies" : ...
- C#利用反射+特性实现简单的实体映射数据库操作类
附上源代码: using System; using System.Collections.Generic; using System.Data; using System.Linq; using S ...
- httpRuntime与ASP.NET 运行时及IIS处理模型
配置 ASP.NET HTTP 运行时设置,以确定如何处理对 ASP.NET 应用程序的请求,配置节及其描述如下所示. <httpRuntime executionTimeout="1 ...