public MSBuildResult[] RunTarget (string target, ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity) { MSBuildResult[] result = null; BuildEngine.RunSTA (delegate { try { var project = SetupProject (configurations); currentLogWriter = logWriter; var logger = new LocalLogger (file); engine.UnregisterAllLoggers (); engine.RegisterLogger (logger); engine.RegisterLogger (consoleLogger); consoleLogger.Verbosity = GetVerbosity (verbosity); project.Build (target); result = logger.BuildResult.ToArray (); } catch (Microsoft.Build.Exceptions.InvalidProjectFileException ex) { var r = new MSBuildResult ( file, false, ex.ErrorSubcategory, ex.ErrorCode, ex.ProjectFile, ex.LineNumber, ex.ColumnNumber, ex.EndLineNumber, ex.EndColumnNumber, ex.BaseMessage, ex.HelpKeyword); logWriter.WriteLine (r.ToString ()); result = new [] { r }; } finally { currentLogWriter = null; } }); return result; }
public MSBuildResult[] RunTarget (string target, ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity) { MSBuildResult[] result = null; BuildEngine.RunSTA (delegate { try { var project = SetupProject (configurations); currentLogWriter = logWriter; LocalLogger logger = new LocalLogger (Path.GetDirectoryName (file)); engine.UnregisterAllLoggers (); engine.RegisterLogger (logger); engine.RegisterLogger (consoleLogger); consoleLogger.Verbosity = GetVerbosity (verbosity); project.Build (target); result = logger.BuildResult.ToArray (); // } catch (InvalidProjectFileException ex) { // result = new MSBuildResult[] { new MSBuildResult (false, ex.ProjectFile ?? file, ex.LineNumber, ex.ColumnNumber, ex.ErrorCode, ex.Message) }; } finally { currentLogWriter = null; } }); return result; }
public MSBuildResult[] RunTarget (string target, ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity) { MSBuildResult[] result = null; BuildEngine.RunSTA (delegate { try { var project = SetupProject (configurations); currentLogWriter = logWriter; var logger = new LocalLogger (file); buildEngine.Engine.UnregisterAllLoggers (); buildEngine.Engine.RegisterLogger (logger); buildEngine.Engine.RegisterLogger (consoleLogger); consoleLogger.Verbosity = GetVerbosity (verbosity); // We are using this BuildProject overload and the BuildSettings.None argument as a workaround to // an xbuild bug which causes references to not be resolved after the project has been built once. buildEngine.Engine.BuildProject (project, new [] { target }, new Hashtable (), BuildSettings.None); result = logger.BuildResult.ToArray (); } catch (InvalidProjectFileException ex) { var r = new MSBuildResult ( file, false, ex.ErrorSubcategory, ex.ErrorCode, ex.ProjectFile, ex.LineNumber, ex.ColumnNumber, ex.EndLineNumber, ex.EndColumnNumber, ex.BaseMessage, ex.HelpKeyword); logWriter.WriteLine (r.ToString ()); result = new [] { r }; } finally { currentLogWriter = null; } }); return result; }
public MSBuildResult Run ( ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity, string[] runTargets, string[] evaluateItems, string[] evaluateProperties) { MSBuildResult result = null; BuildEngine.RunSTA (delegate { try { var project = SetupProject (configurations); currentLogWriter = logWriter; buildEngine.Engine.UnregisterAllLoggers (); var logger = new LocalLogger (file); buildEngine.Engine.RegisterLogger (logger); if (logWriter != null) { buildEngine.Engine.RegisterLogger (consoleLogger); consoleLogger.Verbosity = GetVerbosity (verbosity); } if (runTargets != null && runTargets.Length > 0) { // We are using this BuildProject overload and the BuildSettings.None argument as a workaround to // an xbuild bug which causes references to not be resolved after the project has been built once. buildEngine.Engine.BuildProject (project, runTargets, new Hashtable (), BuildSettings.None); } result = new MSBuildResult (logger.BuildResult.ToArray ()); if (evaluateProperties != null) { foreach (var name in evaluateProperties) result.Properties [name] = project.GetEvaluatedProperty (name); } if (evaluateItems != null) { foreach (var name in evaluateItems) { BuildItemGroup grp = project.GetEvaluatedItemsByName (name); var list = new List<MSBuildEvaluatedItem> (); foreach (BuildItem item in grp) { var evItem = new MSBuildEvaluatedItem (name, UnescapeString (item.FinalItemSpec)); foreach (DictionaryEntry de in (IDictionary) evaluatedMetadataField.GetValue (item)) { evItem.Metadata [(string)de.Key] = UnescapeString ((string)de.Value); } list.Add (evItem); } result.Items[name] = list; } } } catch (InvalidProjectFileException ex) { var r = new MSBuildTargetResult ( file, false, ex.ErrorSubcategory, ex.ErrorCode, ex.ProjectFile, ex.LineNumber, ex.ColumnNumber, ex.EndLineNumber, ex.EndColumnNumber, ex.BaseMessage, ex.HelpKeyword); logWriter.WriteLine (r.ToString ()); result = new MSBuildResult (new [] { r }); } finally { currentLogWriter = null; } }); return result; }
public MSBuildResult[] RunTarget (string target, ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity) { if (target == null) throw new ArgumentNullException ("target"); return builder.RunTarget (target, configurations, logWriter, verbosity); }
public string[] GetSupportedTargets (ProjectConfigurationInfo[] configurations) { string[] result = null; BuildEngine.RunSTA (delegate { try { var project = SetupProject (configurations); result = project.Targets.OfType<Target> ().Select (t => t.Name).ToArray (); } catch { result = new string [0]; } }); return result; }
Project SetupProject (ProjectConfigurationInfo[] configurations) { Project project = null; var slnConfigContents = GenerateSolutionConfigurationContents (configurations); foreach (var pc in configurations) { var p = buildEngine.Engine.GetLoadedProject (pc.ProjectFile); if (p != null && pc.ProjectFile == file) { // building the project may create new items and/or modify some properties, // so we always need to use a new instance of the project when building buildEngine.Engine.UnloadProject (p); p = null; } Environment.CurrentDirectory = Path.GetDirectoryName (file); if (p == null) { p = new Project (buildEngine.Engine); var content = buildEngine.GetUnsavedProjectContent (pc.ProjectFile); if (content == null) { p.Load (pc.ProjectFile); } else { p.FullFileName = pc.ProjectFile; if (HasXbuildFileBug ()) { // Workaround for Xamarin bug #14295: Project.Load incorrectly resets the FullFileName property var t = p.GetType (); t.InvokeMember ("PushThisFileProperty", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, p, new object[] { p.FullFileName }); t.InvokeMember ("DoLoad", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, p, new object[] { new StringReader (content) }); } else { p.Load (new StringReader (content)); } } } p.GlobalProperties.SetProperty ("CurrentSolutionConfigurationContents", slnConfigContents); p.GlobalProperties.SetProperty ("Configuration", pc.Configuration); if (!string.IsNullOrEmpty (pc.Platform)) p.GlobalProperties.SetProperty ("Platform", pc.Platform); else p.GlobalProperties.RemoveProperty ("Platform"); if (pc.ProjectFile == file) project = p; } Environment.CurrentDirectory = Path.GetDirectoryName (file); return project; }
public string[] ResolveAssemblyReferences (ProjectConfigurationInfo[] configurations) { string[] refs = null; var id = configurations [0].Configuration + "|" + configurations [0].Platform; lock (referenceCache) { if (!referenceCache.TryGetValue (id, out refs)) { MSBuildResult result; try { result = builder.Run ( configurations, null, MSBuildVerbosity.Normal, new[] { "ResolveAssemblyReferences" }, new [] { "ReferencePath" }, null ); } catch (Exception ex) { CheckDisconnected (); LoggingService.LogError ("ResolveAssemblyReferences failed", ex); return new string[0]; } List<MSBuildEvaluatedItem> items; if (result.Items.TryGetValue ("ReferencePath", out items) && items != null) { refs = items.Select (i => i.ItemSpec).ToArray (); } else refs = new string[0]; referenceCache [id] = refs; } } return refs; }
public MSBuildResult Run ( ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity, string[] runTargets, string[] evaluateItems, string[] evaluateProperties) { try { return builder.Run (configurations, logWriter, verbosity, runTargets, evaluateItems, evaluateProperties); } catch (Exception ex) { CheckDisconnected (); LoggingService.LogError ("RunTarget failed", ex); MSBuildTargetResult err = new MSBuildTargetResult (file, false, "", "", file, 1, 1, 1, 1, "Unknown MSBuild failure. Please try building the project again", ""); MSBuildResult res = new MSBuildResult (new [] { err }); return res; } }
public string[] GetSupportedTargets (ProjectConfigurationInfo[] configurations) { try { return builder.GetSupportedTargets (configurations); } catch (Exception ex) { CheckDisconnected (); LoggingService.LogError ("GetSupportedTargets failed", ex); return new string[0]; } }
public string[] GetAssemblyReferences (ProjectConfigurationInfo[] configurations) { return builder.GetAssemblyReferences (configurations); }
Project SetupProject (ProjectConfigurationInfo[] configurations) { Project project = null; foreach (var pc in configurations) { var p = engine.GetLoadedProject (pc.ProjectFile); if (p == null) { p = new Project (engine); var content = buildEngine.GetUnsavedProjectContent (pc.ProjectFile); if (content == null) p.Load (pc.ProjectFile); else p.Load (new StringReader (content)); } p.GlobalProperties.SetProperty ("Configuration", pc.Configuration); if (!string.IsNullOrEmpty (pc.Platform)) p.GlobalProperties.SetProperty ("Platform", pc.Platform); else p.GlobalProperties.RemoveProperty ("Platform"); if (pc.ProjectFile == file) project = p; } Environment.CurrentDirectory = Path.GetDirectoryName (file); return project; }
string GenerateSolutionConfigurationContents (ProjectConfigurationInfo[] configurations) { // can't use XDocument because of the 2.0 builder // and don't just build a string because things may need escaping var doc = new XmlDocument (); var root = doc.CreateElement ("SolutionConfiguration"); doc.AppendChild (root); foreach (var config in configurations) { var el = doc.CreateElement ("ProjectConfiguration"); root.AppendChild (el); el.SetAttribute ("Project", config.ProjectGuid); el.SetAttribute ("AbsolutePath", config.ProjectFile); el.InnerText = string.Format (config.Configuration + "|" + config.Platform); } //match MSBuild formatting var options = new XmlWriterSettings { Indent = true, IndentChars = "", OmitXmlDeclaration = true, }; using (var sw = new StringWriter ()) using (var xw = XmlWriter.Create (sw, options)) { doc.WriteTo (xw); xw.Flush (); return sw.ToString (); } }
public MSBuildResult Run ( ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity, string[] runTargets, string[] evaluateItems, string[] evaluateProperties, Dictionary<string,string> globalProperties) { if (runTargets == null || runTargets.Length == 0) throw new ArgumentException ("runTargets is empty"); MSBuildResult result = null; BuildEngine.RunSTA (delegate { try { var project = SetupProject (configurations); currentLogWriter = logWriter; ILogger[] loggers; var logger = new LocalLogger (file); if (logWriter != null) { var consoleLogger = new ConsoleLogger (GetVerbosity (verbosity), LogWriteLine, null, null); loggers = new ILogger[] { logger, consoleLogger }; } else { loggers = new ILogger[] { logger }; } //building the project will create items and alter properties, so we use a new instance var pi = project.CreateProjectInstance (); if (globalProperties != null) foreach (var p in globalProperties) pi.SetProperty (p.Key, p.Value); pi.Build (runTargets, loggers); result = new MSBuildResult (logger.BuildResult.ToArray ()); if (evaluateProperties != null) { foreach (var name in evaluateProperties) { var prop = pi.GetProperty (name); result.Properties [name] = prop != null? prop.EvaluatedValue : null; } } if (evaluateItems != null) { foreach (var name in evaluateItems) { var grp = pi.GetItems (name); var list = new List<MSBuildEvaluatedItem> (); foreach (var item in grp) { var evItem = new MSBuildEvaluatedItem (name, UnescapeString (item.EvaluatedInclude)); foreach (var m in item.Metadata) { evItem.Metadata [m.Name] = UnescapeString (m.EvaluatedValue); } list.Add (evItem); } result.Items[name] = list; } } } catch (Microsoft.Build.Exceptions.InvalidProjectFileException ex) { var r = new MSBuildTargetResult ( file, false, ex.ErrorSubcategory, ex.ErrorCode, ex.ProjectFile, ex.LineNumber, ex.ColumnNumber, ex.EndLineNumber, ex.EndColumnNumber, ex.BaseMessage, ex.HelpKeyword); if (logWriter != null) logWriter.WriteLine (r.ToString ()); result = new MSBuildResult (new [] { r }); } finally { currentLogWriter = null; } }); return result; }
public string[] GetAssemblyReferences (ProjectConfigurationInfo[] configurations) { string[] refsArray = null; BuildEngine.RunSTA (delegate { var project = SetupProject (configurations); // We are using this BuildProject overload and the BuildSettings.None argument as a workaround to // an xbuild bug which causes references to not be resolved after the project has been built once. buildEngine.Engine.BuildProject (project, new [] { "ResolveAssemblyReferences" }, new Hashtable (), BuildSettings.None); BuildItemGroup grp = project.GetEvaluatedItemsByName ("ReferencePath"); var refs = new List<string> (); foreach (BuildItem item in grp) refs.Add (UnescapeString (item.Include)); refsArray = refs.ToArray (); }); return refsArray; }
Project SetupProject (ProjectConfigurationInfo[] configurations) { Project project = null; foreach (var pc in configurations) { var p = buildEngine.Engine.GetLoadedProject (pc.ProjectFile); if (p == null) { p = new Project (buildEngine.Engine); var content = buildEngine.GetUnsavedProjectContent (pc.ProjectFile); if (content == null) p.Load (pc.ProjectFile); else { p.FullFileName = pc.ProjectFile; if (HasXbuildFileBug ()) { // Workaround for Xamarin bug #14295: Project.Load incorrectly resets the FullFileName property var t = p.GetType (); t.InvokeMember ("PushThisFileProperty", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, p, new object[] { p.FullFileName }); t.InvokeMember ("DoLoad", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, p, new object[] { new StringReader (content) }); } else { p.Load (new StringReader (content)); } } } p.GlobalProperties.SetProperty ("Configuration", pc.Configuration); if (!string.IsNullOrEmpty (pc.Platform)) p.GlobalProperties.SetProperty ("Platform", pc.Platform); else p.GlobalProperties.RemoveProperty ("Platform"); if (pc.ProjectFile == file) project = p; } Environment.CurrentDirectory = Path.GetDirectoryName (file); return project; }
public string[] GetAssemblyReferences (ProjectConfigurationInfo[] configurations) { string[] refsArray = null; BuildEngine.RunSTA (delegate { var project = SetupProject (configurations); // We are using this BuildProject overload and the BuildSettings.None argument as a workaround to // an xbuild bug which causes references to not be resolved after the project has been built once. var pi = project.CreateProjectInstance (); pi.Build ("ResolveAssemblyReferences", null); List<string> refs = new List<string> (); foreach (ProjectItemInstance item in pi.GetItems ("ReferencePath")) refs.Add (UnescapeString (item.EvaluatedInclude)); refsArray = refs.ToArray (); }); return refsArray; }
public MSBuildResult Run ( ProjectConfigurationInfo[] configurations, ILogWriter logWriter, MSBuildVerbosity verbosity, string[] runTargets, string[] evaluateItems, string[] evaluateProperties) { return builder.Run (configurations, logWriter, verbosity, runTargets, evaluateItems, evaluateProperties); }
Project SetupProject (ProjectConfigurationInfo[] configurations) { Project project = null; foreach (var pc in configurations) { var p = ConfigureProject (pc.ProjectFile, pc.Configuration, pc.Platform); if (pc.ProjectFile == file) project = p; } Environment.CurrentDirectory = Path.GetDirectoryName (file); return project; }