private (Project, ProjectInstance) GetProjectObjects(string projectFilePath) { var buildLogger = new SimpleMsBuildLogger(); Project project; try { project = new Project( projectFilePath, globalProperties: null, toolsVersion: null, new ProjectCollection( null, new Microsoft.Build.Framework.ILogger[] { buildLogger }, ToolsetDefinitionLocations.Default)); } catch (Exception ex) { this._logger.Log($"Error attempting to load project '{projectFilePath}'."); this._logger.Log(ex.Message); if (_verboseOutput) { this._logger.LogVerbose(buildLogger.LogText); } throw; } ProjectInstance projectInstance = _designTimeBuilder.Execute(project); return(project, projectInstance); }
public ProjectInstance Execute(Project project) { _logger.LogVerbose($"Beginning design-time build of project {project.FullPath}."); _logger.LogVerbose("Setting the following global properties:"); foreach (KeyValuePair <string, string> kvp in _globalProperties) { project.SetGlobalProperty(kvp.Key, kvp.Value); _logger.LogVerbose($" {kvp.Key}={kvp.Value}"); } ProjectInstance projectInstance = project.CreateProjectInstance(); var designTimeBuildTargets = new string[] { "CollectResolvedSDKReferencesDesignTime", "CollectPackageReferences", "ResolveComReferencesDesignTime", "ResolveProjectReferencesDesignTime", "BuiltProjectOutputGroup", "ResolveAssemblyReferencesDesignTime", "CollectSDKReferencesDesignTime", "ResolvePackageDependenciesDesignTime", "CompileDesignTime", "CollectFrameworkReferences", "CollectUpToDateCheckBuiltDesignTime", "CollectPackageDownloads", "CollectAnalyzersDesignTime", "CollectUpToDateCheckInputDesignTime", "CollectUpToDateCheckOutputDesignTime", "CollectResolvedCompilationReferencesDesignTime" }; SimpleMsBuildLogger buildLogger; bool result = false; int retries = 0; // Retrying here as there are some odd cases where a file will be in use by another process // long enough for this to fail, but will work on a subsequent attempt. do { buildLogger = new SimpleMsBuildLogger(); _logger.LogVerbose($"Attempting design-time build # {retries + 1}..."); result = projectInstance.Build(designTimeBuildTargets, new Microsoft.Build.Framework.ILogger[] { buildLogger }); }while (!result && (++retries < _numRetries)); if (!result || _alwaysLogBuildLog) { _logger.LogVerbose("Design time build log:"); _logger.LogVerbose(buildLogger.LogText); _logger.LogVerbose(string.Empty); } if (!result) { throw new Exception("Failed to build project.\r\n" + buildLogger.ErrorText); } return(projectInstance); }