private string GetExeToolPathFromSetupConfiguration(ILogger logger) { string toolPath = null; logger.LogDebug(Resources.CONV_DIAG_LocatingCodeCoverageToolSetupConfiguration); ISetupConfiguration configurationQuery = setupConfigurationFactory.GetSetupConfigurationQuery(); if (configurationQuery != null) { IEnumSetupInstances instanceEnumerator = configurationQuery.EnumInstances(); int fetched; ISetupInstance[] tempInstance = new ISetupInstance[1]; List <ISetupInstance2> instances = new List <ISetupInstance2>(); //Enumerate the configuration instances do { instanceEnumerator.Next(1, tempInstance, out fetched); if (fetched > 0) { ISetupInstance2 instance = (ISetupInstance2)tempInstance[0]; if (instance.GetPackages().Any(p => p.GetId() == CodeCoverageInstallationPackage)) { //Store instances that have code coverage package installed instances.Add((ISetupInstance2)tempInstance[0]); } } } while (fetched > 0); if (instances.Count > 1) { logger.LogDebug(Resources.CONV_DIAG_MultipleVsVersionsInstalled, string.Join(", ", instances.Select(i => i.GetInstallationVersion()))); } //Get the installation path for the latest visual studio found var visualStudioPath = instances.OrderByDescending(i => i.GetInstallationVersion()) .Select(i => i.GetInstallationPath()) .FirstOrDefault(); if (visualStudioPath != null) { toolPath = Path.Combine(visualStudioPath, TeamToolPathandExeName); } } else { logger.LogDebug(Resources.CONV_DIAG_SetupConfigurationNotSupported); } return(toolPath); }