前文演示了编译SSCLI最简便的方法(在Windows下):

  1. 在“Visual Studio 2005 Command Prompt”下,进入SSCLI的根目录;
  2. 运行 env.bat 脚本准备环境;
  3. 运行 buildall.cmd 脚本开始编译过程。

env.bat设置了当前SSCLI的运行环境,命令的语法是:`env [option]`,其中[option]可以是debug、checked和free,各个环境选项说明如下表:

选项

说明

debug

关闭代码优化设置,启用调试用代码(一般是通过条件编译开关),生成调试用符号文件。

checked

打开代码优化设置,启动调试用代码,生成符号文件。

free

打开代码优化设置,关闭调试用代码,生成符号文件。

出于解读代码的需要,一般都会选择debug选项。

设定好运行环境后,buildall.cmd的编译过程可以分为下面几大步骤:

  1. 编译基本的引导工具集:平台抽象层(PAL)和非托管程序(unmanaged)编译工具;
  2. 编译辅助的引导工具集:剩余的工具集和相关基础架构;
  3. 编译CLR内核、基本类库,C#编译器和其他支持工具;
  4. 编译其它.NET类库和支持工具
  5. 编译其它托管程序的编译器,如JS编译器。

其实.NET天生就是跨平台的,SSCLI 2.0除了支持Windows平台,还支持FreeBSD和Mac OS X,源码可以在FreeBSD 4.8和Mac OS X 10.2下编译通过,通过修改一些源码,还可以在Linux平台下编译和使用,实际上SSCLI 1.1通过一些修改可以在Red Hat 8.0下编译通过。

为了在后文说明方便,这里用SSCLI内置的几个环境变量来指代将会提到的文件夹路径:

  • %ROTOR_DIR%: SSCLI的根目录,如Windows平台下一般是“c:\sscli”,在编译过程中,编译系统会自行设置此环境变量。
  • %_NTTREE%:整个SSCLI编译输出结果的保存路径,其值一般是:“%ROTOR_DIR%\binaries.x86*.rotor\”,*号根据 env.bat 的选项赋值,如env.bat的选项是“debug”,那么它的值就是“%ROTOR_DIR%\binaries.x86dbg.rotor\”。

基本引导工具集

SSCLI的源码由C++、C#这些非托管和托管编程语言组成,而且SSCLI是跨平台的,因此在编译过程中编译系统会用操作系统上安装的C++编译器编译好编译SSCLI剩余源码的工具集。在这一步编译过程中,基本引导工具集包括下面这些组件:

  • 平台抽象层(PAL):PAL是系统中其它所有组件的依赖项,因此必须先编译它:

源码位置(Windows平台):%ROTOR_DIR%\pal\win32

源码位置(Unix平台):%ROTOR_DIR%\pal\unix

输出路径:%_NTTREE%\rotor_pal.dll

  • Nmake工具集:nmake是Windows SDK系统下的编译工具,类似unix下的make。SSCLI自带了nmake的源码,如果是在Unix或Linux系统下编译,会编译此工具;或者在Windows平台下,就用SDK系统下自带的nmake工具了:

源码位置:%ROTOR_DIR%\tools\nmake

输出路径:%_NTTREE%\nmake.exe

  • 编译结果的处理工具:

源码位置:%ROTOR_DIR%\tools\binplace

输出路径:%_NTTREE%\binplace.exe

  • 编译系统其它组件的编译工具集:

源码位置:%ROTOR_DIR%\tools\build

输出路径:%_NTTREE%\build.exe

辅助引导工具集

辅助引导工具集与前面基本引导工具集的区别是,辅助引导工具集用的是SSCLI编译系统自带的build.exe编译的,源文件列表等编译规则是保存在sources.lst文件里的,而基本引导工具集是用make命令编译,而且源文件列表等编译规则是保存在makefile文件夹里的。

辅助引导工具集保护下列这些组件:

  • 资源编译器

源码位置:%ROTOR_DIR%\tools\resourcecompiler

输出路径:%_NTTREE%\resourcecompiler.exe

  • PAL运行时(PAL RT):PAL RT包含了SSCLI和其一些辅助工具都用到的跨平台的功能。

源码位置:%ROTOR_DIR%\palrt\src

输出路径:%_NTTREE%\rotor_palrt.dll

编译CLR内核、基本类库,C#编译器和其他支持工具

引导工具集编译完成后,就可以开始编译整个CLR、.NET基本类库、C#编译器等工具了,各工具的源码位置、输出路径如下图所示:

源码路经

说明

\clr\src

整个CLR内核和基本类库的源码路经

\clr\src\vm

CLR虚拟机引擎的源码,包括GC、JIT、类库加载器等完整功能

\csharp

C#编译器和Assembly链接程序的源码路经

\clr\src\bcl

.NET基本类库源码,如System.IO、System.Collections这些命名空间下面的类库源码都在这里

\clr\src\dlls

其它进程跟CLR虚拟机交换的几个关键DLL的源码,包括下面这些组件:

  • shim:主要是确定当前机器上安装了哪些.net版本
  • mscorsn:用来做强签名验证
  • mscorpe:Windows平台可执行文件PE格式读写库
  • mscoree:用来在进程中加载CLR虚拟机
  • mscordbi和mscordbc:调试服务

\src\utilcode

被很多CLR虚拟机组件共享的通用代码

\src\fjit

JIT编译器,即mscorejit.dll的源码

\src\fusion

搜索和加载Assembly、GAC(Global Assembly Cache)的组件,即fusion.dll的源码

\src\ilasm

IL语言编译器

\src\ildasm

IL反编译工具

\src\debug

托管调试器 cordbg 的源码

\src\md

Assembly元数据读写库

\src\tools

多个非托管工具的源码:

  • clix – 托管程序解释执行工具
  • ildbsymbols – 托管程序调试符号文件读写工具
  • metainfo – assembly元数据读取工具
  • peverify – 验证托管程序的IL程序
  • internalresgen –
  • sn – 强签名操作工具
  • permview – Assembly权限查看工具
  • gac – 全局Assembly缓存管理工具
  • sos – Windbg调试.NET程序的辅助函数库

其它.NET类库和支持工具

这里面提供了一些除基本类库以外的少量类库源码:

  • System.dll

源码位置:%ROTOR_DIR%\fx\src\sys

  • System.xml.dll

源码位置:%ROTOR_DIR%\fx\src\xml

  • System.Runtime.Serialization.Formatters.Soap.dll

源码位置:%ROTOR_DIR%\managedlibraries\soapserializer

  • System.Runtime.Remoting.dll

源码位置:%ROTOR_DIR%\managedlibraries\remoting

其它托管程序的编译器

SSCLI里面还附带了一个使用C#语言开发的Microsoft Jscript编译器实现,而这个编译器本身就能编译托管程序,其源码路经是:%ROTOR_DIR%\jscript

.NET框架源码解读之SSCLI编译过程简介的更多相关文章

  1. .NET框架源码解读之SSCLI的调试支持

    阅读源码一个比较快的手段就是在调试器里阅读,这样可以在实际运行SSCLI的过程中,通过堆栈跟踪的方式查看完整的程序执行路径. 当在SSCLI环境里执行一个托管程序的时候,堆栈上通常有托管和非托管代码同 ...

  2. OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式

    在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...

  3. .NET框架源码解读之启动CLR

    前面提到在SSCLI环境里运行.NET程序的时候,执行的命令类似java程序的执行过程,即通过clix程序解释执行.net程序.这个过程看起来跟在windows环境下执行.net程序表面上看起来不一样 ...

  4. .NET框架源码解读之MYC编译器

    在SSCLI里附带了两个示例编译器源码,用来演示CLR整个架构的弹性,一个是简化版的lisp编译器,一个是简化版的C编译器.lisp在国内用的少,因此这里我们主要看看C编译器的源码,源码位置是:\ss ...

  5. .NET框架源码解读之准备CLR源码阅读环境

    微软发布了CLR 2.0的源码,这个源码是可以直接在freebsd和windows环境下编译及运行的,请在微软shared source cli(http://www.microsoft.com/en ...

  6. Python Web Flask源码解读(三)——模板渲染过程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  7. mysql源码解读之事务提交过程(二)

    上一篇文章我介绍了在关闭binlog的情况下,事务提交的大概流程.之所以关闭binlog,是因为开启binlog后事务提交流程会变成两阶段提交,这里的两阶段提交并不涉及分布式事务,当然mysql把它称 ...

  8. mysql源码解读之事务提交过程(一)

    mysql是一种关系型数据库,关系型数据库一个重要的特性就是支持事务,这是区别于no-sql产品的一个核心特性.当然了,no-sql产品支持键值查询,不能支持sql语句,这也是一个区别.今天主要讨论下 ...

  9. jQuery框架源码解读

    1.jQuery 1.9.1 parseJSON: function( data ) { // Attempt to parse using the native JSON parser first ...

随机推荐

  1. Centos生成SSL证书的步骤

    1.yum install openssl安装openssl组件2.生成KEY的流程步骤如下 1. 创建根证书密钥文件(自己做CA)root.key: openssl genrsa -out root ...

  2. 利用U盘安装Redhat-server-Linux-7.1

    利用U盘安装Redhat-server-Linux-7.1 [原]红帽 Red Hat Linux相关产品iso镜像下载[百度云]

  3. pm无力的话

    1. 先这样做吧, 等不行再改 2. 用户的需求不明确, 他们对于自己的业务也不明白, 现在是我们在帮助他们缕清自己的业务, 这个迭代的过程中,有很多问题,我们程序员既不能参与到业务, 也不能猜测业务 ...

  4. Electron 前端页面导入jQuery 出现错误Uncaught ReferenceError: jQuery is not defined

    如下: <script src="../assets/js/jquery-1.10.2.js"></script> 方法1 改为: <script&g ...

  5. 网页中显示pdf的方法

    非常好的在网页中显示pdf的方法 今天有一需求,要在网页中显示pdf,于是立马开始搜索解决方案,无意中发现一个非常好的解决方法,详见http://blogs.adobe.com/pdfdevjunki ...

  6. Back to CNBLOG

    突然发现自己很久都没有写过博客了,感觉有点愧对程序员这个称号... 任重道远,要做的东西很多,越来发现,坚持是最难的,例如写博客. 但起码有有个开始,要有个开始去分享自己的经历,去让别人也知道,你是怎 ...

  7. FTP和TCP、UDP

    应用:TFTP客户端 1. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文 ...

  8. Centos 7.2基础安装和配置(含分区方案建议)

    景:windows桌面运维为主的我,前几天接到一个去某客户上架安装服务器的工作任务,含糊的说要上架几台服务器顺便安装Centos系统,于是我便下载了一个Centos7.2版本的镜像,顺利的用USBwr ...

  9. 跟我学算法- tensorflow模型的保存与读取 tf.train.Saver()

    save =  tf.train.Saver() 通过save. save() 实现数据的加载 通过save.restore() 实现数据的导出 第一步: 数据的载入 import tensorflo ...

  10. 2 数据库开发--MySQL下载(windows)

    Windows:(mysql) 操作: 0.下载安装mysql www.mysql.org downloads->进入社区community community 5.7.21 下载5.6 Mic ...