在解决方案中获取所有包含的className

时间:2014-11-28 04:25:17

标签: c# winforms

有没有办法可以在解决方案中获得所有包含的类? 至少allClassNames,例如classname.cs

但事情是创建用于查找includedClass in other solution的代码。 这意味着不是我在做代码而是另一种解决方案的解决方案。

这是迄今为止我研究的内容:

Parsing Visual Studio Solution files

但我仍然混淆如何通过路径(.sln)获取它?或者我该如何实现它。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

您可以做的是首先阅读解决方案文件并获取所包含的项目 如果您使用记事本打开解决方案文件,您会注意到项目列为下面的

Project("{00000000-0000-0000-0000-000000000000}") = "project name", "project path", "{00000000-0000-0000-0000-000000000000}"

例如,您可以使用reguler expretion获取项目列表 获得项目列表后,您可以阅读项目文件并获取所有代码文件的列表 项目文件采用xml格式

        string solutionFile="the solution file";FileInfo fInfo = new FileInfo(solutionFile);
        string solutionText = File.ReadAllText(solutionFile);
        Regex reg = new Regex("Project\\(\"[^\"]+\"\\) = \"[^\"]+\", \"([^\"]+)\", \"[^\"]+\"");
        MatchCollection mc = reg.Matches(solutionText);
        List<string> files = new List<string>();
        foreach (Match m in mc)
        {
            string project_file = m.Groups[1].Value;
            project_file = System.IO.Path.Combine(fInfo.Directory.FullName, project_file);
            if (System.IO.File.Exists(project_file))
            {
                string project_path = new FileInfo(project_file).DirectoryName;
                XmlDocument doc = new XmlDocument();
                doc.Load(project_file);                    
                XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
                ns.AddNamespace("ms", "http://schemas.microsoft.com/developer/msbuild/2003");
                System.Xml.XmlNodeList list = doc.ChildNodes[1].SelectNodes("//ms:ItemGroup/ms:Compile", ns);
                foreach (XmlNode node in list)
                {
                    files.Add(Path.Combine(project_path, node.Attributes["Include"].InnerText));
                }
            }
        }

参考资料更新: 您可以使用此代码来阅读参考。

               XmlNodeList references = doc.ChildNodes[1].SelectNodes("//ms:ItemGroup/ms:Reference", ns);
                foreach (XmlNode node in references)
                {
                    string name_space = node.Attributes["Include"].InnerText;
                    string name_space_path;
                    XmlNode nHintPath = node.SelectSingleNode("//ms:HintPath", ns);
                    if (nHintPath != null)
                    {
                        name_space_path = nHintPath.InnerText;
                        if (!Path.IsPathRooted(name_space_path))
                        {
                            name_space_path = Path.Combine(project_path, name_space_path);
                        }
                    }
                }