public SolutionInfo(string filePath, VisualStudioVersion version, SolutionConfigManager configManager, string contents) { FilePath = Path.GetFullPath(filePath); Name = Path.GetFileNameWithoutExtension(filePath); Version = version; Contents = contents; ConfigManager = configManager; Projects = new Dictionary <string, ProjectInfo>(); }
private bool ParseCppProject(ref string line, VisualStudioVersion version, string solutionDirectory, SolutionConfigManager configManager) { if (!line.StartsWith("Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\")")) // Guid for C++ projects { return(false); } if (version == VisualStudioVersion.VSUnknown) { throw new InvalidDataException("Solution file is corrupt. Found C++ project section before solution file format information."); } string extension = version >= VisualStudioVersion.VS2010 ? ".vcxproj" : ".vcproj"; int extensionIndex = line.IndexOf(extension, System.StringComparison.Ordinal); if (extensionIndex <= 0) { throw new InvalidDataException("Solution file is corrupt. Found C++ project without project fileName."); } int projectFileNameIndex = line.LastIndexOf('"', extensionIndex) + 1; if (projectFileNameIndex <= 0) { throw new InvalidDataException("Solution file is corrupt. Found C++ project without project fileName."); } string projectFileName = line.Substring(projectFileNameIndex, extensionIndex - projectFileNameIndex) + extension; string projectGuid = line.Substring(extensionIndex + extension.Length + "\", \"".Length, GuidPlaceholder.Length); if (projectGuid.Length != GuidPlaceholder.Length) { throw new InvalidDataException("Solution file is corrupt. Couldn't correctly parse C++ project GUID."); } string destProjectFileName = _settings.ModifyFileName(projectFileName); line = line.Substring(0, projectFileNameIndex) + destProjectFileName + line.Substring(extensionIndex + extension.Length); configManager.AddProject(Path.GetFullPath(Path.Combine(solutionDirectory, projectFileName)), projectGuid); return(true); }
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())); }