示例#1
0
        /// <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;
        }
示例#2
0
        /// <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;
        }
示例#3
0
        /// <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);
                            }
                        }
                    }
                }
            }
        }
示例#4
0
        /// <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;
        }
示例#5
0
        /// <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);
                    }
                }
            }
        }
示例#6
0
 public static string GetTargetFramework(this Project project)
 {
     return project.AsMsBuildProject().GetPropertyValue("TargetFrameworkMoniker") ?? string.Empty;
 }