.Net源码老早就和和Vs2008一起开源出来了,但是却只能调试的时候使用。后来有个工具可以一起下载,但是下下来的貌似不全,也好多错误。
刚刚发现一个地址:http://referencesource.microsoft.com/netframework.aspx,貌似还很早就有这个了,竟让一直都不知道。就下载了一个 里面有很多版本8.0好像就是.net 3.5sp1,4就是.net4。现在是100来M的msi安装包,解压后600多M,其中一半是pdb文件。源码有200多M吧。不过看一下这路径,他丫不就远程调试那个包吗,呃,不说啥,将就整理下吧。
没办法自己整理吧,写了个小程序,递归遍历所有的文件,读取文件内容,按照namespce的结构重建目录:
具体实现如下:
static string OrginFolderPath = @"F:\Source\NetFramework\3.5\Source"; static string TargetFolderPath = @"F:\Net3.5\"; static int flag = 1; static void Main(string[] args) { DirectoryInfo donetFrameworkDirectry = new DirectoryInfo(OrginFolderPath); ReCollectionFrameworkFiles(donetFrameworkDirectry); Console.WriteLine("End of collection~~~~~"); Console.ReadLine(); } static void ReCollectionFrameworkFiles(DirectoryInfo directory) { foreach (FileSystemInfo f in directory.GetFileSystemInfos()) { if (f is FileInfo) { string newPath = RemoveFolderByNameSpace((FileInfo)f); //Console.WriteLine(newPath); if (!string.IsNullOrEmpty(newPath)) { string foldername = TargetFolderPath + newPath; if (!Directory.Exists(foldername)) { Directory.CreateDirectory(foldername); } string fileFullName = foldername + f.Name; if (File.Exists(fileFullName)) { fileFullName = Path.ChangeExtension(fileFullName, "cs" + flag.ToString()); //show conflict files Console.WriteLine("Conflict orgin:" + f.FullName + "\t targer:" + fileFullName); flag++; } File.Copy(f.FullName, fileFullName); // Console.WriteLine(f.FullName); } else { //not find the namespace // Console.WriteLine(f.FullName); File.AppendAllText(@"F:\log.txt", f.FullName+"\r\n"); } } else { ReCollectionFrameworkFiles((DirectoryInfo)f); } } } static string RemoveFolderByNameSpace(FileInfo file) { if (file.Name.EndsWith(".cs")) { string codeInfo = file.OpenText().ReadToEnd(); Regex reg = new Regex(@"^[ ]*namespace[ ]+(?<namespace>[\w\.]+)",RegexOptions.Multiline); var temp = reg.Match(codeInfo).Groups; //Console.WriteLine(temp["namespace"]); if (temp != null && temp.Count > 1) { string strnamespace = temp[1].Value; return GenerationFolderPath(strnamespace); } } return null; } static string GenerationFolderPath(string strnamespace) { string[] strs = strnamespace.Split(new char[] { '.' }); string folder = string.Empty; foreach (var s in strs) { folder += s + @"\"; } return folder; }
前两个可以设置你的源目录和目的目录,一两分钟就可以完成重新计算目录结构。我统计了一下,大概还是有150来个重复的文件,都是被修改后缀放在对应的目录下。还有一些是没有namespace的都写入了日志文件,不多。
这样整理之后System下就有比较完整的源码了,200多M应该会很全,看了一下注释还是很全。通过vs的从目录创建项目经过漫长的过程,建立项目文件,又编译好久竟然蹦出几千个错误。神啊,这不是玩我啊,接口定义全没,有些类也没有,微软这也叫开源啊~~主要是很多的类都重复了,还有150个同名的类~~嗷,只是看看而已,没法编译也没关系。