/// <summary> /// Evaluates the specified condition in the project. /// WARNING: EvaluateCondition might add a temporary property group and remove it again, /// which invalidates enumerators over the list of property groups! /// </summary> internal static bool EvaluateCondition(MSBuild.Project project, string condition) { const string propertyName = "MSBuildInternalsEvaluateConditionDummyPropertyName"; MSBuild.BuildPropertyGroup pGroup = project.AddNewPropertyGroup(true); pGroup.AddNewProperty(propertyName, "ConditionFalse"); pGroup.AddNewProperty(propertyName, "ConditionTrue").Condition = condition; bool result = project.GetEvaluatedProperty(propertyName) == "ConditionTrue"; project.RemovePropertyGroup(pGroup); return result; }
internal static void EnsureCorrectTempProject(MSBuild.Project baseProject, string configuration, string platform, ref MSBuild.Project tempProject) { if (configuration == null && platform == null) { // unload temp project if (tempProject != null && tempProject != baseProject) { tempProject.ParentEngine.UnloadAllProjects(); } tempProject = null; return; } if (configuration == null) configuration = baseProject.GetEvaluatedProperty("Configuration"); if (platform == null) platform = baseProject.GetEvaluatedProperty("Platform"); if (tempProject != null && tempProject.GetEvaluatedProperty("Configuration") == configuration && tempProject.GetEvaluatedProperty("Platform") == platform) { // already correct return; } if (baseProject.GetEvaluatedProperty("Configuration") == configuration && baseProject.GetEvaluatedProperty("Platform") == platform) { tempProject = baseProject; return; } // create new project // unload old temp project if (tempProject != null && tempProject != baseProject) { tempProject.ParentEngine.UnloadAllProjects(); } try { MSBuild.Engine engine = CreateEngine(); tempProject = engine.CreateNewProject(); // tell MSBuild the path so that projects containing <Import Project="relativePath" /> // can be loaded tempProject.FullFileName = baseProject.FullFileName; MSBuildBasedProject.InitializeMSBuildProject(tempProject); tempProject.LoadXml(baseProject.Xml); tempProject.SetProperty("Configuration", configuration); tempProject.SetProperty("Platform", platform); } catch (Exception ex) { ICSharpCode.Core.MessageService.ShowWarning(ex.ToString()); tempProject = baseProject; } }