微软发布了CLR 2.0的源码,这个源码是可以直接在freebsd和windows环境下编译及运行的,请在微软shared source clihttp://www.microsoft.com/en-us/download/details.aspx?id=4917)链接处下载,并用7zip等工具解压,以后简称sscli – 即Shared Source CLI。

解压后,根目录下有readfirst.html文件,里面说明了该开源版本里包含的功能列表:

  1. 泛型的实现;
  2. 轻量级的代码生成;
  3. 委托的实现;
  4. 反射;
  5. 装配件(Assembly)的元数据格式;
  6. 匿名函数和委托;
  7. .NET基本类库(BCL);

编译和运行代码

要编译clr源码的话,需要满足下面条件:

  • Microsoft Visual Studio 2005专业版以上,请使用默认安装,避免在编译的时候各种找不到文件的情况;
  • Perl。

另外,还有一个准备步骤,这个问题在中文版的Windows系统中都会遇到,由于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而直接导致部分编译失败。解决方法有:

  1. 把全部有问题的源代码转换成Unicode编码;
  2. 更改系统当前的区域设置(Locale)为英文
一般来说改系统的Locale最合适。在“控制面板”中“日期、时间、语言和区域设置”中的“区域和语言选项”的“高级”页中修改“非Unicode程序的语言”的选项为“英文(美国)” ,重启即可。
 
在编译过程中,需要将几个程序加入PATH路径,以便编译程序能找到它们:
 
  1. 将Perl的路径包含进来,如:C:\Perl\bin;

安装好上面的软件并将sscli源码解压之后,打开“Visual Studio 2005 Command Prompt”窗口,切换到sscli的根目录,下面假设根目录路径是:c:\sscli。依次执行下面的命令:

cd /d c:sscli

rem 设置当前编译和运行环境为调试环境

env debug

rem 编译所有的程序

buildall

  

编译成功之后,写一个简单的C#文件,如下表:

using System;

public class Hello
{
public static void Main()
{
Console.WriteLine("Hello, sscli");
}
}

  

在编译CLR源码的控制台运行下面的命令编译和执行C#程序(前面执行的 env debug命令,已经自动设置好PATH环境变量,C#编译器csc.exe程序指向的是我们编译好的程序):

  1. 编译:csc test.cs
  2. 运行程序:clix test.exe

注意

  1. 尽量使用英文原版的Windows XP进行编译,或者按前所述改成英文的区域设置;
  2. 不要使用VS 2005以上的IDE编译,我曾经用VS 2008编译成功过,但写这篇文章的时候又碰到很多编译错误,为了省事的话,尽量用VS 2005编译;
  3. 需要确认VS 2005安装好以后,有“C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK”这个文件夹,在编译的时候,需要用到里面的头文件和库文件。

.NET框架源码解读之准备CLR源码阅读环境的更多相关文章

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

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

  2. Spring源码解读--(一)源码下载

    走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...

  3. jquery源码解读 (摘自jQuery源码分析系列图书(pdf)) 持续更新

    1.总体架构 1.1自调用匿名函数 //自调用匿名函数 (function(window,undefined){ //jquery code})(window); 1.这是一个自调用匿名函数.第一个括 ...

  4. jvm源码解读--20 结合jvm源码理解 java 设计模式 模板方法

    write by 张艳涛 前言: 在学习jvm之前,看过设计模式的书,知道模板方法的设计模式,今天在看java并发编程的艺术里面关于AbstractQueuedSynchronizer 用法,这个就使 ...

  5. java.lang.system 类源码解读

    通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...

  6. js便签笔记(10) - 分享:json2.js源码解读笔记

    1. 如何理解“json” 首先应该意识到,json是一种数据转换格式,既然是个“格式”,就是个抽象的东西.它不是js对象,也不是字符串,它只是一种格式,一种规定而已. 这个格式规定了如何将js对象转 ...

  7. Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读

    本文主要说明Webpack模块构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack的基础构建原理. 本文使用的W ...

  8. socketserver源码解读

       在看源码之前我们先来看看有关继承的知识(看源码就是在找继承关系----个人理解) 继承 : 我们先看上面的代码,这是一个简单的类继承,我们可以看到父类Base和子类Son,它们中各有一个Test ...

  9. 基于Docker的TensorFlow机器学习框架搭建和实例源码解读

    概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...

随机推荐

  1. 一些部署django用到的linux命令

    mv untitled45/ /1601F/wang/ 将XXXX移动到XXX,也可以用于给XXX重新命名 zip -r -q -o hello.zip  /1601F/3/untitled45 安静 ...

  2. EqualsBuilder 类的使用

    apache的commons-lang包提供了一个EqualsBuilder类,提供了基本属性.数组.对象等比较操作的封装,可以辅助实现对象的equals(Object)方法. 这个类的使用比较简单, ...

  3. Mysql 备份脚本和window下如何实现自动备份

    @echo offecho.echo      MySQL数据库备份 echo *****************************echo.echo 今天是 %date%echo 时间是 %t ...

  4. 分布式锁实践(二)-ZooKeeper实现总结

    写在最前面 前几周写了篇 利用Redis实现分布式锁 ,今天简单总结下ZooKeeper实现分布式锁的过程.其实生产上我只用过Redis或者数据库的方式,之前还真没了解过ZooKeeper怎么实现分布 ...

  5. asp.net,C#操作数据库DataTable关于空null的判断

    double d=0;if(!Convert.IsDBNull(DataTable.Rows[i][m])){    string str=DataTable.Rows[i][m].ToString( ...

  6. leetcode116

    class Solution { public: void connect(TreeLinkNode *root) { if (root != NULL) { queue<TreeLinkNod ...

  7. c++类对象 指针区别

    class Test{ public: int a; Test(){ a = ; } }; int main1() { Test* t1 = new Test(); t1->a = ; Test ...

  8. 可视化库-Matplotlib-Pandas与sklearn结合(第四天)

    1. 计算每一种的比例的百分比 import pandas as pd from matplotlib.ticker import FuncFormatter np.random.seed(0) df ...

  9. window.location 属性

    属性 含义 值 protocol: 协议 "http:" hostname: 服务器的名字 "b.a.com" port: 端口 "88" ...

  10. FastJson bean序列化属性顺序问题

    fastjson序列化一个java bean,默认是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序,这个特性需要1.1.42以上版本.示例如下. import co ...