public ITargetedProjectContext GetInnerProjectContext(ProjectConfiguration projectConfiguration, out bool isActiveConfiguration) { if (projectConfiguration.IsCrossTargeting()) { string targetFrameworkMoniker = projectConfiguration.Dimensions[ConfigurationGeneral.TargetFrameworkProperty]; ITargetFramework targetFramework = TargetFrameworkProvider.GetTargetFramework(targetFrameworkMoniker); isActiveConfiguration = _activeTargetFramework.Equals(targetFramework); return(_configuredProjectContextsByTargetFramework.TryGetValue(targetFramework, out ITargetedProjectContext projectContext) ? projectContext : null); } else { isActiveConfiguration = true; if (_configuredProjectContextsByTargetFramework.Count > 1) { return(null); } return(InnerProjectContexts.Single()); } }
/// <summary> /// Returns true if this cross-targeting aggregate project context has the same set of target frameworks and active target framework as the given TargetFrameworks property value. /// </summary> /// <param name="targetFrameworksProperty">Property value for MSBuild property "TargetsFramework"</param> public bool HasMatchingTargetFrameworks(string targetFrameworksProperty) { Requires.NotNull(targetFrameworksProperty, nameof(targetFrameworksProperty)); Requires.Range(IsCrossTargeting, nameof(targetFrameworksProperty), "This method should only be invoked for Cross targeting projects"); ImmutableArray <string> parsedTargetFrameworks = BuildUtilities.GetPropertyValues(targetFrameworksProperty); if (parsedTargetFrameworks.Length != _configuredProjectContextsByTargetFramework.Count) { // Different number of target frameworks. return(false); } if (!_activeTargetFramework.Equals(parsedTargetFrameworks[0])) { // Active target framework is different. return(false); } foreach (var targetFrameworkMoniker in parsedTargetFrameworks.Skip(1)) { var targetFramework = TargetFrameworkProvider.GetTargetFramework(targetFrameworkMoniker); if (!_configuredProjectContextsByTargetFramework.ContainsKey(targetFramework)) { // Differing TargetFramework return(false); } } return(true); }
/// <summary> /// Returns true if this cross-targeting aggregate project context has the same set of target frameworks and active target framework as the given active and known configurations. /// </summary> public bool HasMatchingTargetFrameworks(ProjectConfiguration activeProjectConfiguration, IEnumerable <ProjectConfiguration> knownProjectConfigurations) { Assumes.True(IsCrossTargeting); Assumes.True(activeProjectConfiguration.IsCrossTargeting()); Assumes.True(knownProjectConfigurations.All(c => c.IsCrossTargeting())); ITargetFramework activeTargetFramework = TargetFrameworkProvider.GetTargetFramework(activeProjectConfiguration.Dimensions[ConfigurationGeneral.TargetFrameworkProperty]); if (!_activeTargetFramework.Equals(activeTargetFramework)) { // Active target framework is different. return(false); } var targetFrameworks = knownProjectConfigurations.Select( c => c.Dimensions[ConfigurationGeneral.TargetFrameworkProperty]).ToImmutableHashSet(); if (targetFrameworks.Count != _configuredProjectContextsByTargetFramework.Count) { // Different number of target frameworks. return(false); } foreach (string targetFrameworkMoniker in targetFrameworks) { ITargetFramework targetFramework = TargetFrameworkProvider.GetTargetFramework(targetFrameworkMoniker); if (!_configuredProjectContextsByTargetFramework.ContainsKey(targetFramework)) { // Differing TargetFramework return(false); } } return(true); }