.NET / Rotor 源码研究1 - Building Rotor

Introduction
Shared Source CLI 2.0 (开发代号Rotor) 是微软.NET Framework 2.0的Shared Source实现版本。Shared Source是微软推出的源代码共享计划,可以在一定限制的情况下获得/使用源代码,详情可以参考Microsoft Shared Source Initiative主页:http://www.microsoft.com/resources/sharedsource/。Rotor的代码可以在非商业行为的前提下可以自由修改和发布,只需保留License声明即可。Rotor包含了下面的内容:

1.       CLI的运行时(CLR)的符合ECMA标准的实现
2.       C# & Jscript编译器
3.       .NET Framework中的部分工具,如ilasm, ildasm, cordbg, gacutil, sn等
4.       Build工具,如Build, Binplace, NMake等
5.       PAL (Platform Adaptation Layer),支持其他平台
6.       自动化回归测试
7.       Samples
由此可见,Rotor是研究.NET Framework实现的最佳材料。
Rotor的全部源代码可以在微软的MSDN网站上下载:http://msdn.microsoft.com/net/sscli/
下载后解压缩,可以看到如下的目录结构:

目录
内容
Binaries.x86*.rotor
Build出来的可执行文件和Symbols。这个目录在Build之后才会出现
clr
CLI和BCL(Base Class Library)的实现
csharp
C#编译器的实现就在这里了
Docs
文档
Env
Build时所需的一些文件
Fx
类库的实现
Jscript
Jscript编译器的实现
Pal
Platform Adaptation Layer的实现。PAL是Rotor对Windows和Unix的一些基本API的封装
Palrt
Platform Adaptive Layer Runtime的实现。PAL中的和操作系统平台无关可重用的部分
prebuilt
存放着build所需的一些事先用工具生成好的文件
Samples
Samples
Tests
Regression Test Suite
Tools
Build工具,包括binplace, build, cppmunge等
Vscommon
公共头文件,主要是微软内部使用的一些产品有关的公用的宏定义
总共大概有150MB左右。
Build之前的准备
要Build Rotor,首先必须安装Perl。常用的Perl版本有ActiveState Perl和官方Perl。微软.NET Team使用的便是ActiveState Perl,可以在这里下载:http://www.activestate.com/Products/ActivePerl/,直接安装一路Next即可。
此外,在Build Rotor之前,还有一个准备步骤,这个问题只要是中国人一般就会遇到的 由于Rotor中部分源代码以ANSI字符存放,其中中含有在936 Code Page,也就是Simplified Chinese GBK扩展字符集下无法解析的字符,在Build的时候VC编译器CL会报warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss。同时在Build的时候由于打开了/WX开关,任何warning都会被当作是error而直接导致Build Fail。解决方法有二:
  1. 把全部有问题的源代码转换成Unicode
  2. 更改系统当前的Locale,改成英文
因为手头没有合适的工具,还是改系统的Locale最合适。在Regional And Language Options的Advance页中修改Language for non-Unicode programs的选项为English (United States) ,重启即可。

Build
准备工作做完之后,打开Command Prompt,进入到Rotor所在的目录,键入:
env debug
这条命令会设置Build所需的各种环境变量。后面跟的参数代表Build的Configuration,如下:

参数
意义
Debug
Debug版本
checked
Debug版本,带有调试信息,但优化是打开的,速度比debug快
Free
Free版本,也就是通常所说的Release,速度最快,无调试信息
既然是要研究Rotor的源代码,当然我们应该选用Debug版本了。
env.bat会直接调用env.win.bat,env.win.bat则会调用env.core.pl。env.core.pl是unix/linux/windows下面所共用的环境设置Perl脚本。

10/21/2007更新:如果在Windows上执行env.bat的时候报"Could not get platform OS version"错误,请参看这篇文章:.NET/Rotor源码研究1补遗:解决无法检测操作系统版本的错误

设置完环境之后,键入:
buildall
buildall首先会build所需的工具,如Build,BinPlace等,然后再调用生成的Build.exe来遍历目录调用NMAKE来Build。对build有兴趣的朋友可以参考sscli20/docs/buildtools/buildutility.html中的内容。
等待大概10分钟到半小时的样子,Rotor就build完毕了,最后生成的可执行文件在binaries.x86dbg.rotor目录下。假如Build出错了话,可以参考目录下的build*.log/.err/.wrn文件。根据Build是Debug/Checked/Free版本,对应的文件名也稍有不同。
Hello World!
Build完毕之后进入sscli20/binaries.x86dbg.rotor,键入:
csc ../samples/hello/hello.cs
调用CSC编译器(C#编译器)编译Samples中的hello.cs生成hello.exe。
之后,调用Managed Application Loader运行hello.exe:
clix hello.exe
结果自然是:
Hello World!
Next
下一篇文章将研究Rotor中hello.exe的执行过程,揭示Manage代码的基本运行机制。 

 

 

作者:      ATField
E-Mail:   atfield_zhang@hotmail.com
Blog:     
http://blog.csdn.net/atfield

展开阅读全文

没有更多推荐了,返回首页