internal void Read(TextReader reader, string line, ref int curLineNum) { Line = curLineNum; int n = 0; FindNext(curLineNum, line, ref n, '('); n++; FindNext(curLineNum, line, ref n, '"'); int n2 = n + 1; FindNext(curLineNum, line, ref n2, '"'); TypeGuid = line.Substring(n + 1, n2 - n - 1); n = n2 + 1; FindNext(curLineNum, line, ref n, ')'); FindNext(curLineNum, line, ref n, '='); FindNext(curLineNum, line, ref n, '"'); n2 = n + 1; FindNext(curLineNum, line, ref n2, '"'); Name = line.Substring(n + 1, n2 - n - 1); n = n2 + 1; FindNext(curLineNum, line, ref n, ','); FindNext(curLineNum, line, ref n, '"'); n2 = n + 1; FindNext(curLineNum, line, ref n2, '"'); FilePath = line.Substring(n + 1, n2 - n - 1); n = n2 + 1; FindNext(curLineNum, line, ref n, ','); FindNext(curLineNum, line, ref n, '"'); n2 = n + 1; FindNext(curLineNum, line, ref n2, '"'); Id = line.Substring(n + 1, n2 - n - 1); while ((line = reader.ReadLine()) != null) { curLineNum++; line = line.Trim(); if (line == "EndProject") { return; } if (line.StartsWith("ProjectSection", StringComparison.Ordinal)) { if (_sections == null) { _sections = new SlnSectionCollection(); } var sec = new SlnSection(); _sections.Add(sec); sec.Read(reader, line, ref curLineNum); } } throw new InvalidSolutionFormatException( curLineNum, "ProjectSectionNotClosedError"); }
internal SlnPropertySetCollection(SlnSection parentSection) { _parentSection = parentSection; }
public void Read(TextReader reader) { const string HeaderPrefix = "Microsoft Visual Studio Solution File, Format Version"; string line; int curLineNum = 0; bool globalFound = false; bool productRead = false; while ((line = reader.ReadLine()) != null) { curLineNum++; line = line.Trim(); if (line.StartsWith(HeaderPrefix, StringComparison.Ordinal)) { if (line.Length <= HeaderPrefix.Length) { throw new InvalidSolutionFormatException( curLineNum, "FileHeaderMissingVersionError"); } FormatVersion = line.Substring(HeaderPrefix.Length).Trim(); _prefixBlankLines = curLineNum - 1; } if (line.StartsWith("# ", StringComparison.Ordinal)) { if (!productRead) { productRead = true; ProductDescription = line.Substring(2); } } else if (line.StartsWith("Project", StringComparison.Ordinal)) { SlnProject p = new SlnProject(); p.Read(reader, line, ref curLineNum); _projects.Add(p); } else if (line == "Global") { if (globalFound) { throw new InvalidSolutionFormatException( curLineNum, "GlobalSectionMoreThanOnceError"); } globalFound = true; while ((line = reader.ReadLine()) != null) { curLineNum++; line = line.Trim(); if (line == "EndGlobal") { break; } else if (line.StartsWith("GlobalSection", StringComparison.Ordinal)) { var sec = new SlnSection(); sec.Read(reader, line, ref curLineNum); _sections.Add(sec); } else // Ignore text that's out of place { continue; } } if (line == null) { throw new InvalidSolutionFormatException( curLineNum, "GlobalSectionNotClosedError"); } } else if (line.IndexOf('=') != -1) { _metadata.ReadLine(line, curLineNum); } } if (FormatVersion == null) { throw new InvalidSolutionFormatException("FileHeaderMissingError"); } }
public void Generate(bool EnableRebuild) { var s = new SlnFile(); s.FullPath = Path.GetFullPath(Path.Combine(OutputDirectory, SolutionName + ".sln")); using (var sr = new StringReader(SlnTemplateText)) { s.Read(sr); } s.Projects.Clear(); s.ProjectConfigurationsSection.Clear(); SlnSection NestedProjects = null; foreach (var Section in s.Sections.Where(Section => Section.Id == "NestedProjects")) { Section.Clear(); NestedProjects = Section; } if (NestedProjects == null) { NestedProjects = new SlnSection { Id = "NestedProjects" }; s.Sections.Add(NestedProjects); } var Filters = new Dictionary <String, String>(StringComparer.OrdinalIgnoreCase); foreach (var Project in ProjectReferences) { var Dir = Project.VirtualDir.Replace('/', '\\'); if (!Filters.ContainsKey(Dir)) { var CurrentDir = Dir; while ((CurrentDir != "") && !Filters.ContainsKey(CurrentDir)) { var g = Guid.ParseExact(Hash.GetHashForPath(CurrentDir, 32), "N").ToString().ToUpper(); Filters.Add(CurrentDir, g); CurrentDir = Path.GetDirectoryName(CurrentDir); if (CurrentDir != "") { var gUpper = Guid.ParseExact(Hash.GetHashForPath(CurrentDir, 32), "N").ToString().ToUpper(); NestedProjects.Properties.SetValue("{" + g + "}", "{" + gUpper + "}"); } } } s.Projects.Add(new SlnProject { TypeGuid = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}", Name = Project.Name, FilePath = FileNameHandling.GetRelativePath(Project.FilePath, OutputDirectory), Id = "{" + Project.Id + "}" }); var conf = new SlnPropertySet("{" + Project.Id + "}"); foreach (var c in s.SolutionConfigurationsSection) { var Value = c.Value.Replace("|x86", "|Win32"); conf.SetValue(c.Key + ".ActiveCfg", Value); conf.SetValue(c.Key + ".Build.0", Value); } s.ProjectConfigurationsSection.Add(conf); NestedProjects.Properties.SetValue("{" + Project.Id + "}", "{" + Filters[Dir] + "}"); } foreach (var f in Filters) { s.Projects.Add(new SlnProject { TypeGuid = "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", Name = Path.GetFileName(f.Key), FilePath = Path.GetFileName(f.Key), Id = "{" + f.Value + "}" }); } foreach (var Section in s.Sections.Where(Section => Section.Id == "ExtensibilityGlobals")) { Section.Properties.SetValue("SolutionGuid", "{" + SolutionId.ToUpper() + "}"); } String Text; using (var sw = new StringWriter()) { s.Write(sw); Text = sw.ToString(); } TextFile.WriteToFile(s.FullPath, Text, Encoding.UTF8, !EnableRebuild); }