in src/MSBuildLocator/VisualStudioLocationHelper.cs [28:86]
internal static IList<VisualStudioInstance> GetInstances()
{
var validInstances = new List<VisualStudioInstance>();
try
{
// This code is not obvious. See the sample (link above) for reference.
var query = (ISetupConfiguration2) GetQuery();
var e = query.EnumAllInstances();
int fetched;
var instances = new ISetupInstance[1];
do
{
// Call e.Next to query for the next instance (single item or nothing returned).
e.Next(1, instances, out fetched);
if (fetched <= 0) continue;
var instance = (ISetupInstance2) instances[0];
InstanceState state = instance.GetState();
if (!Version.TryParse(instance.GetInstallationVersion(), out Version version))
continue;
// If the install was complete and a valid version, consider it.
if (state == InstanceState.Complete ||
(state.HasFlag(InstanceState.Registered) && state.HasFlag(InstanceState.NoRebootRequired)))
{
bool instanceHasMSBuild = false;
foreach (ISetupPackageReference package in instance.GetPackages())
{
if (string.Equals(package.GetId(), "Microsoft.Component.MSBuild", StringComparison.OrdinalIgnoreCase))
{
instanceHasMSBuild = true;
break;
}
}
if (instanceHasMSBuild)
{
validInstances.Add(new VisualStudioInstance(
instance.GetDisplayName(),
instance.GetInstallationPath(),
version,
DiscoveryType.VisualStudioSetup));
}
}
} while (fetched > 0);
}
catch (COMException)
{
}
catch (DllNotFoundException)
{
// This is OK, VS "15" or greater likely not installed.
}
return validInstances;
}