.NET框架源码解读之准备CLR源码阅读环境
微软发布了CLR 2.0的源码,这个源码是可以直接在freebsd和windows环境下编译及运行的,请在微软shared source cli(http://www.microsoft.com/en-us/download/details.aspx?id=4917)链接处下载,并用7zip等工具解压,以后简称sscli – 即Shared Source CLI。
解压后,根目录下有readfirst.html文件,里面说明了该开源版本里包含的功能列表:
- 泛型的实现;
- 轻量级的代码生成;
- 委托的实现;
- 反射;
- 装配件(Assembly)的元数据格式;
- 匿名函数和委托;
- .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而直接导致部分编译失败。解决方法有:
- 把全部有问题的源代码转换成Unicode编码;
- 更改系统当前的区域设置(Locale)为英文
- 将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程序指向的是我们编译好的程序):
- 编译:csc test.cs
- 运行程序:clix test.exe
注意
- 尽量使用英文原版的Windows XP进行编译,或者按前所述改成英文的区域设置;
- 不要使用VS 2005以上的IDE编译,我曾经用VS 2008编译成功过,但写这篇文章的时候又碰到很多编译错误,为了省事的话,尽量用VS 2005编译;
- 需要确认VS 2005安装好以后,有“C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK”这个文件夹,在编译的时候,需要用到里面的头文件和库文件。
.NET框架源码解读之准备CLR源码阅读环境的更多相关文章
- .NET框架源码解读之启动CLR
前面提到在SSCLI环境里运行.NET程序的时候,执行的命令类似java程序的执行过程,即通过clix程序解释执行.net程序.这个过程看起来跟在windows环境下执行.net程序表面上看起来不一样 ...
- Spring源码解读--(一)源码下载
走在Java程序员这条路上,网上Java各种工具满天飞,写个简单的CRUD,相信是个开发都能写出来,于是在思考如何可以在同行业中更有竞争力(其实就是如何赚更多钱).那么,老大给我推荐了Spring源码 ...
- jquery源码解读 (摘自jQuery源码分析系列图书(pdf)) 持续更新
1.总体架构 1.1自调用匿名函数 //自调用匿名函数 (function(window,undefined){ //jquery code})(window); 1.这是一个自调用匿名函数.第一个括 ...
- jvm源码解读--20 结合jvm源码理解 java 设计模式 模板方法
write by 张艳涛 前言: 在学习jvm之前,看过设计模式的书,知道模板方法的设计模式,今天在看java并发编程的艺术里面关于AbstractQueuedSynchronizer 用法,这个就使 ...
- java.lang.system 类源码解读
通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...
- js便签笔记(10) - 分享:json2.js源码解读笔记
1. 如何理解“json” 首先应该意识到,json是一种数据转换格式,既然是个“格式”,就是个抽象的东西.它不是js对象,也不是字符串,它只是一种格式,一种规定而已. 这个格式规定了如何将js对象转 ...
- Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读
本文主要说明Webpack模块构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack的基础构建原理. 本文使用的W ...
- socketserver源码解读
在看源码之前我们先来看看有关继承的知识(看源码就是在找继承关系----个人理解) 继承 : 我们先看上面的代码,这是一个简单的类继承,我们可以看到父类Base和子类Son,它们中各有一个Test ...
- 基于Docker的TensorFlow机器学习框架搭建和实例源码解读
概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...
随机推荐
- 常见的加密和解密算法—AES
一.AES加密概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用 ...
- CFGym 101194L 题解
一.题目链接 http://codeforces.com/gym/101194/problem/L 二.题意 有4个队伍,要打6场比赛(刚好每两个队伍都能相互比一次),若A和B比赛有3种结果: A赢B ...
- Keras 入门
“sample”“batch”“epoch” Sample:样本,比如:一张图像是一个样本,一段音频也是一个样本. Batch:批,含有N个样本的集合.每一个batch的样本都是独立的并行处理.在训练 ...
- socket和udp简介
socket简介 1.本地的进程间通信(IPC)有很多种方式,例如 队列 同步(互斥锁.条件变量等) 以上通信方式都是在一台机器上不同进程之间的通信方式,那么问题来了 网络中进程之间如何通信? 2. ...
- 学习了django对于sqlite3进行了了解,谈谈看法
学习了django对于sqlite3进行了了解,谈谈看法 由于django默认使用的是sqlite3,写了几个建表语句, 然后数据做下迁移,其实就是建表语句的执行. 一直对sqlite3没有一个直观的 ...
- leetcode507
public class Solution { public bool CheckPerfectNumber(int num) { ) { return false; } ; ; i <= nu ...
- Eclipse can not find the tag library descriptor for http://java.sun.com/jsf/*
问题页面: <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ ta ...
- oracle ora-01652无法通过128(在表空间xxx中)扩展 问题解决方式
问题原因建立的表空间dbf文件大小上限了 一. select * from dba_data_files 使用该条语句可以查看当前库中有多少表空间并且DBF文件的存储位置 二.查看表空间是否开启了自动 ...
- angular性能优化心得
原文出处 脏数据检查 != 轮询检查更新 谈起angular的脏检查机制(dirty-checking), 常见的误解就是认为: ng是定时轮询去检查model是否变更.其实,ng只有在指定事件触发后 ...
- eclipse中项目出现红色的!
eclipse中项目出现红色的!的原因有二个:1.jdk不匹配 2.缺少jar包