.net Framework框架源码下载及整理

      .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个同名的类~~嗷,只是看看而已,没法编译也没关系。

posted @ 2010-08-22 12:55  LittlePeng  阅读(5826)  评论(7编辑  收藏  举报