in src/Microsoft.VisualStudio.SlnGen/SlnFile.cs [236:322]
public static bool TryParseExistingSolution(string path, out Guid solutionGuid, out IReadOnlyDictionary<string, Guid> projectGuidsByPath)
{
solutionGuid = default;
projectGuidsByPath = default;
bool foundSolutionGuid = false;
Dictionary<string, Guid> projectGuids = new Dictionary<string, Guid>(StringComparer.OrdinalIgnoreCase);
FileInfo fileInfo = new FileInfo(path);
if (!fileInfo.Exists || fileInfo.Directory == null)
{
return false;
}
using FileStream stream = File.OpenRead(path);
using StreamReader reader = new StreamReader(stream, Encoding.GetEncoding(0), detectEncodingFromByteOrderMarks: true);
string line;
while ((line = reader.ReadLine()) != null)
{
if (line.StartsWith(ProjectSectionStart))
{
string[] projectDetails = line.Split(ProjectSectionSeparator, StringSplitOptions.RemoveEmptyEntries);
if (projectDetails.Length == 3)
{
Match projectGuidMatch = GuidRegex.Match(projectDetails[2]);
if (!projectGuidMatch.Groups["Guid"].Success)
{
continue;
}
string projectGuidString = projectGuidMatch.Groups["Guid"].Value;
Match projectTypeGuidMatch = GuidRegex.Match(projectDetails[0]);
if (!projectTypeGuidMatch.Groups["Guid"].Success)
{
continue;
}
if (!Guid.TryParse(projectGuidString, out Guid projectGuid) || !Guid.TryParse(projectTypeGuidMatch.Groups["Guid"].Value, out Guid projectTypeGuid))
{
continue;
}
string projectPath = projectDetails[1].Trim().Trim('\"');
projectGuids[projectPath] = projectGuid;
}
while ((line = reader.ReadLine()) != null)
{
if (line.StartsWith(ProjectSectionEnd))
{
break;
}
}
}
if (line != null && line.StartsWith(GlobalSectionStartExtensibilityGlobals))
{
while ((line = reader.ReadLine()) != null)
{
if (line.StartsWith(SectionSettingSolutionGuid))
{
string solutionGuidString = line.Substring(SectionSettingSolutionGuid.Length);
foundSolutionGuid = Guid.TryParse(solutionGuidString, out solutionGuid);
}
if (line.StartsWith(GlobalSectionEnd))
{
break;
}
}
}
}
projectGuidsByPath = projectGuids;
return foundSolutionGuid;
}