/// <summary> /// Get compatible configurations of VC-project. E.g. Debug|Win32, Release|Win32, ... depending on architecture /// </summary> public static IEnumerable<string> GetCompatibleConfigurations(this Project project, string architecture) { var buildProject = project.AsMsBuildProject(); var result = new List<string>(); if (buildProject != null) { var xml = buildProject.Xml; var itemDefinitionGroups = xml.ItemDefinitionGroups; foreach (var itemDefinitionGroup in itemDefinitionGroups) { string condition = itemDefinitionGroup.Condition; string configuration = condition.Substring(33, condition.LastIndexOf("'", StringComparison.InvariantCulture) - 33); // 1. Platform string string platform = configuration.Split('|')[1].ToLowerInvariant(); // 2. TargetMachine definition var machine = project.GetDefinitionValue(configuration, "TargetMachine"); if (((platform == "win32" || platform == "x86") && architecture == "x86") || ((platform == "win64" || platform == "x64") && architecture == "x64") || machine.ToLowerInvariant().Contains(architecture)) { result.Add(configuration); } } } return result; }
/// <summary> /// Get configurations of VC-project. E.g. Debug|Win32, Release|Win32, ... /// </summary> public static IEnumerable<string> GetConfigurations(this Project project) { var buildProject = project.AsMsBuildProject(); var result = new List<string>(); if (buildProject != null) { var xml = buildProject.Xml; var itemDefinitionGroups = xml.ItemDefinitionGroups; foreach (var itemDefinitionGroup in itemDefinitionGroups) { string condition = itemDefinitionGroup.Condition; result.Add(condition.Substring(33, condition.LastIndexOf("'", StringComparison.InvariantCulture) - 33)); } } return result; }
/// <summary> /// Set definition in VC-project. /// </summary> private static void SetDefinitionValue(this Project project, string configuration, string elementName, string elementValue) { var buildProject = project.AsMsBuildProject(); if (buildProject != null) { foreach (var itemDefinitionGroup in buildProject.Xml.ItemDefinitionGroups) { if (itemDefinitionGroup.Condition.Contains(configuration)) { foreach (ProjectItemDefinitionElement element in itemDefinitionGroup.Children) { switch (element.ItemType) { case "ClCompile": case "Link": foreach (ProjectMetadataElement subElement in element.Children) { if (subElement.Name == elementName) { // subelement found subElement.Value = elementValue; return; } } break; } // subelement not found, create new if ((element.ItemType == "ClCompile" && elementName == "AdditionalIncludeDirectories") || (element.ItemType == "Link" && (elementName == "AdditionalLibraryDirectories" || elementName == "AdditionalDependencies"))) { element.AddMetadata(elementName, elementValue); } } } } } }
/// <summary> /// Get definition in VC-project. /// </summary> private static string GetDefinitionValue(this Project project, string configuration, string elementName) { var buildProject = project.AsMsBuildProject(); if (buildProject != null) { foreach (var itemDefinitionGroup in buildProject.Xml.ItemDefinitionGroups) { if (itemDefinitionGroup.Condition.Contains(configuration)) { foreach (ProjectItemDefinitionElement element in itemDefinitionGroup.Children) { switch (element.ItemType) { case "ClCompile": case "Link": foreach (ProjectMetadataElement subElement in element.Children) { if (subElement.Name == elementName) { return subElement.Value; } } break; } } } } } return string.Empty; }
/// <summary> /// Add or remove references in .NET-project. /// </summary> public static void ManageReferences(this Project project, PackageReference packageReference, IEnumerable<LibraryReference> libraries) { string path = string.Format(@"{0}\ReferenceAssemblies\{1}\{2}\{3}-{4}\", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), packageReference.CanonicalName.Flavor, packageReference.CanonicalName.Architecture, packageReference.CanonicalName.Name, packageReference.CanonicalName.Version); var buildProject = project.AsMsBuildProject(); var vsProject = (VSProject)project.Object; if (buildProject != null && vsProject != null) { foreach (var lib in libraries) { var assemblyName = Path.GetFileNameWithoutExtension(lib.Name); var assemblyPath = path + lib.Name; Reference reference = null; // Remove old references do { try { reference = vsProject.References.Find(assemblyName); } catch { } if (reference != null) { reference.Remove(); } } while (reference != null); // Add new reference if (lib.IsChecked) { vsProject.References.Add(assemblyPath); var references = buildProject.GetAssemblyReferences(); var referenceItem = references.First(n => n.Item2.Name == assemblyName).Item1; referenceItem.SetMetadataValue("HintPath", assemblyPath); } } } }
public static string GetTargetFramework(this Project project) { return project.AsMsBuildProject().GetPropertyValue("TargetFrameworkMoniker") ?? string.Empty; }