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。解决方法有二:
- 把全部有问题的源代码转换成Unicode
- 更改系统当前的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脚本。
设置完环境之后,键入:
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!