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

  • 相关阅读:
    SQL 07: 外连接 (左连接和右连接查询)
    010 利用多线程使socket服务端可以与多个客户端同时通讯
    056 文件修改的两种方式
    009 模拟一个简单抢票小程序代码
    055 文件的高级应用
    054 with管理文件操作上下文
    008 通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题)
    053 文件的三种打开模式
    052 绝对路径和相对路径
    051 基本的文件操作
  • 原文地址:https://www.cnblogs.com/lulu/p/1805739.html
Copyright © 2020-2023  润新知