Exemplo n.º 1
0
        public SolutionInfo Read(string fileName)
        {
            var    solutionFormatVersion = VisualStudioVersion.VSUnknown;
            var    visualStudioVersion   = VisualStudioVersion.VSUnknown;
            var    visualStudioName      = VisualStudioVersion.VSUnknown;
            var    version           = VisualStudioVersion.VSUnknown;
            var    configManager     = new SolutionConfigManager();
            var    destSolutionText  = new StringBuilder();
            string solutionDirectory = Path.GetDirectoryName(fileName);

            string currentGlobalSection = string.Empty;

            using (var reader = new StreamReader(fileName))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    if (string.IsNullOrEmpty(line))
                    {
                        line = null;
                    }
                    else if (ParseSolutionFormatVersion(line, "9.00", VisualStudioVersion.VS2005, ref solutionFormatVersion) ||
                             ParseSolutionFormatVersion(line, "10.00", VisualStudioVersion.VS2008, ref solutionFormatVersion) ||
                             ParseSolutionFormatVersion(line, "11.00", VisualStudioVersion.VS2010, ref solutionFormatVersion) ||
                             ParseSolutionFormatVersion(line, "12.00", VisualStudioVersion.VS2012, ref solutionFormatVersion))  // Note that VS 2013 and 2015 retain solution formation version 12.00!
                    {
                        version = solutionFormatVersion;
                    }
                    else if (ParseVisualStudioName(line, "2005", VisualStudioVersion.VS2005, ref visualStudioName) ||
                             ParseVisualStudioName(line, "2008", VisualStudioVersion.VS2008, ref visualStudioName) ||
                             ParseVisualStudioName(line, "2010", VisualStudioVersion.VS2010, ref visualStudioName) ||
                             ParseVisualStudioName(line, "2012", VisualStudioVersion.VS2012, ref visualStudioName) ||
                             ParseVisualStudioName(line, "2013", VisualStudioVersion.VS2013, ref visualStudioName) ||
                             ParseVisualStudioName(line, "14", VisualStudioVersion.VS2015, ref visualStudioName) ||
                             ParseVisualStudioName(line, "15", VisualStudioVersion.VS2017, ref visualStudioName))
                    {
                        version = visualStudioName;
                    }
                    else if (ParseVisualStudioVersion(line, "8.0", VisualStudioVersion.VS2005, ref visualStudioVersion) ||
                             ParseVisualStudioVersion(line, "9.0", VisualStudioVersion.VS2008, ref visualStudioVersion) ||
                             ParseVisualStudioVersion(line, "10.0", VisualStudioVersion.VS2010, ref visualStudioVersion) ||
                             ParseVisualStudioVersion(line, "11.0", VisualStudioVersion.VS2012, ref visualStudioVersion) ||
                             ParseVisualStudioVersion(line, "12.0", VisualStudioVersion.VS2013, ref visualStudioVersion) ||
                             ParseVisualStudioVersion(line, "14.0", VisualStudioVersion.VS2015, ref visualStudioVersion) ||
                             ParseVisualStudioVersion(line, "15.0", VisualStudioVersion.VS2017, ref visualStudioVersion))
                    {
                        version = visualStudioVersion;
                    }
                    else if (ParseCppProject(ref line, version, solutionDirectory, configManager))
                    {
                    }
                    else if (ParseGlobalSectionStart(line, ref currentGlobalSection))
                    {
                    }
                    else if (ParseGlobalSectionEnd(line, ref currentGlobalSection))
                    {
                    }
                    else if (!string.IsNullOrEmpty(currentGlobalSection))
                    {
                        if (currentGlobalSection == "SourceCodeControl")
                        {
                            // Remove anything inside a SourceCodeControl section in the RudeBuild-generated solution file.
                            line = null;
                        }
                        else if (currentGlobalSection == "SolutionConfigurationPlatforms")
                        {
                            string solutionConfig = line.Trim();
                            int    index          = solutionConfig.IndexOf(" = ", StringComparison.Ordinal);
                            if (index > 0)
                            {
                                solutionConfig = solutionConfig.Substring(0, index);
                                configManager.AddSolutionConfig(solutionConfig);
                            }
                        }
                        else if (currentGlobalSection == "ProjectConfigurationPlatforms")
                        {
                            string trimmedLine = line.Trim();
                            string projectGuid = trimmedLine.Substring(0, GuidPlaceholder.Length);
                            if (projectGuid.Length != GuidPlaceholder.Length)
                            {
                                throw new InvalidDataException("Solution file is corrupt. Expected project GUID at beginning of line: " + trimmedLine);
                            }

                            int solutionConfigStartIndex = GuidPlaceholder.Length + 1;
                            int solutionConfigEndIndex   = trimmedLine.IndexOf('.', solutionConfigStartIndex);
                            if (solutionConfigEndIndex <= 0)
                            {
                                throw new InvalidDataException("Solution file is corrupt. Expected solution config after project GUID in line: " + trimmedLine);
                            }
                            string solutionConfig = trimmedLine.Substring(solutionConfigStartIndex, solutionConfigEndIndex - solutionConfigStartIndex);

                            int projectConfigStartIndex = trimmedLine.IndexOf(" = ", solutionConfigEndIndex, StringComparison.Ordinal);
                            if (projectConfigStartIndex <= 0)
                            {
                                throw new InvalidDataException("Solution file is corrupt. Expected project config after = in line: " + trimmedLine);
                            }
                            string projectConfig = trimmedLine.Substring(projectConfigStartIndex + 3);

                            string activeCfg = trimmedLine.Substring(solutionConfigEndIndex + 1, projectConfigStartIndex - solutionConfigEndIndex - 1);
                            if (activeCfg == "ActiveCfg")
                            {
                                configManager.SetProjectConfig(projectGuid, solutionConfig, projectConfig);
                            }
                        }
                    }

                    if (line != null)
                    {
                        destSolutionText.AppendLine(line);
                    }
                }
            }

            if (version == VisualStudioVersion.VSUnknown)
            {
                throw new InvalidDataException("Solution file '" + fileName + "' is corrupt. It does not contain a Visual Studio version.");
            }

            return(new SolutionInfo(fileName, version, configManager, destSolutionText.ToString()));
        }