internal static IList GetInstances()

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;
        }