public static ProjectSection CreateSection(string projectFile,
                                                   string solutionFile, string platform, string configuration)
        {
            ProjectSectionContext context = new ProjectSectionContext();

            context.SolutionFile  = solutionFile;
            context.Platform      = platform;
            context.Configuration = configuration;

            if (String.IsNullOrEmpty(projectFile))
            {
                return(null);
            }
            projectFile = Path.GetFullPath(
                Environment.ExpandEnvironmentVariables(projectFile));

            string fileExt = Path.GetExtension(projectFile);

            if (String.IsNullOrEmpty(fileExt))
            {
                return(null);
            }

            return(CreateSection(context, projectFile));
        }
示例#2
0
        public virtual bool Parse(ProjectSectionContext context, string projectFile)
        {
            _context = context;

            _projectFile = Path.GetFullPath(
                Environment.ExpandEnvironmentVariables(projectFile));

            // Extract the project directory for the resolution of the relative paths...
            string projectDir = Path.GetDirectoryName(_projectFile);

            if (!projectDir.EndsWith("\\", StringComparison.Ordinal))
            {
                projectDir += "\\";
            }

            _projectDir = projectDir;

            // Reset all the current properties...
            _platform                  = String.Empty;
            _outputType                = String.Empty;
            _outputPath                = String.Empty;
            _outputFile                = String.Empty;
            _commentFile               = String.Empty;
            _assemblyName              = String.Empty;
            _configuration             = String.Empty;
            _targetFrameworkVersion    = String.Empty;
            _targetFrameworkIdentifier = String.Empty;

            _referencedAssemblies      = new List <string>();
            _referencedPaths           = new List <string>();
            _referencedKnownAssemblies = new List <string>();

            return(true);
        }
        public override bool Parse(ProjectSectionContext context, string projectFile)
        {
            if (!base.Parse(context, projectFile))
            {
                return(false);
            }

            // Open the project for parsing...
            _project = ProjectRootElement.Open(this.ProjectFile, new ProjectCollection());

            return(_project != null);
        }
        public static ProjectSection CreateSection(ProjectSectionContext context,
                                                   string projectFile)
        {
            if (String.IsNullOrEmpty(projectFile))
            {
                return(null);
            }
            projectFile = Path.GetFullPath(
                Environment.ExpandEnvironmentVariables(projectFile));

            string fileExt = Path.GetExtension(projectFile);

            if (String.IsNullOrEmpty(fileExt))
            {
                return(null);
            }

            ProjectSection projectSection = null;

            switch (fileExt.ToLower())
            {
            case ".csproj":
            case ".vbproj":
            case ".fsproj":
            case ".pyproj":
            case ".rbproj":
            case ".vjsproj":
                projectSection = new StandardProjectSection();
                projectSection.Parse(context, projectFile);
                break;

            case ".vcproj":
                // For the Visual C++ project, these are required...
                RequiresAll(context.SolutionFile, context.Platform,
                            context.Configuration);

                projectSection = new VcProjectSection();
                projectSection.Parse(context, projectFile);
                break;

            case ".vcxproj":
                // For the Visual C++ project, these are required...
                RequiresAll(context.SolutionFile, context.Platform,
                            context.Configuration);

                projectSection = new VcxProjectSection();
                projectSection.Parse(context, projectFile);
                break;
            }

            return(projectSection);
        }
        public static ProjectSection CreateSection(ProjectSectionContext context,
                                                   ProjectInfo projectInfo)
        {
            if (context != null)
            {
                ProjectSection projectSection = context.GetProjectSection(
                    projectInfo.ProjectGuid);

                if (projectSection != null)
                {
                    return(projectSection);
                }
            }

            return(CreateSection(context, projectInfo.ProjectPath));
        }
示例#6
0
        public override bool Parse(ProjectSectionContext context, string projectFile)
        {
            _standardType = StandardProjectType.None;

            if (!base.Parse(context, projectFile))
            {
                return(false);
            }

            _standardType = ProjectSectionFactory.GetStandardType(projectFile);

            bool isSuccessful = this.ParseProperties();

            if (!isSuccessful)
            {
                // If not successful, we try parsing "Choose" elements, since the ff.
                // is equally valid as conditioned property group....

                //<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
                //    <PropertyGroup>
                //        <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
                //        <OutputType>Exe</OutputType>
                //        <RootNamespace>Application1</RootNamespace>
                //        <AssemblyName>Application1</AssemblyName>
                //        <WarningLevel>4</WarningLevel>
                //    </PropertyGroup>
                //    <Choose>
                //        <When Condition=" '$(Configuration)'=='debug' ">
                //            <PropertyGroup>
                //                <OutputPath>.\bin\Debug\</OutputPath>
                //            </PropertyGroup>
                //        </When>
                //        <When Condition=" '$(Configuration)'=='retail' ">
                //            <PropertyGroup>
                //                <OutputPath>.\bin\Release\</OutputPath>
                //            </PropertyGroup>
                //        </When>
                //        <Otherwise>
                //            <PropertyGroup>
                //                <OutputPath>.\bin\$(Configuration)\</OutputPath>
                //            </PropertyGroup>
                //        </Otherwise>
                //    </Choose>
                //</Project>

                isSuccessful = this.ParseChoose();
            }

            if (!isSuccessful)
            {
                return(isSuccessful);
            }

            List <ProjectInfo> referencedProjects = new List <ProjectInfo>();

            isSuccessful = this.ParseReferenceItems(referencedProjects);

            this.CreateChildren(referencedProjects);

            return(isSuccessful);
        }
        public static IList <ProjectSection> CreateSections(string sourceFile,
                                                            string platform, string configuration, HashSet <string> targetProjectGuids)
        {
            sourceFile = Path.GetFullPath(
                Environment.ExpandEnvironmentVariables(sourceFile));

            string fileExt = Path.GetExtension(sourceFile);

            if (String.IsNullOrEmpty(fileExt))
            {
                return(null);
            }

            ProjectSectionContext context = new ProjectSectionContext();

            context.Platform      = platform;
            context.Configuration = configuration;

            if (targetProjectGuids != null && targetProjectGuids.Count != 0)
            {
                context.RegisterTargets(targetProjectGuids);
            }

            List <ProjectSection> projectSections = new List <ProjectSection>();

            if (fileExt.Equals(".sln", StringComparison.OrdinalIgnoreCase))
            {
                context.SolutionFile = sourceFile;

                IList <ProjectInfo> listProjectInfo = GetProjectInfo(sourceFile);

                if (listProjectInfo != null && listProjectInfo.Count != 0)
                {
                    // Register projects for reference resolution...
                    context.RegisterInfo(listProjectInfo);

                    // If we are documenting all, then add the targets...
                    if (targetProjectGuids == null || targetProjectGuids.Count == 0)
                    {
                        for (int i = 0; i < listProjectInfo.Count; i++)
                        {
                            ProjectInfo projectInfo = listProjectInfo[i];

                            if (projectInfo != null && projectInfo.IsValid)
                            {
                                context.RegisterTarget(projectInfo.ProjectGuid);
                            }
                        }
                    }

                    for (int i = 0; i < listProjectInfo.Count; i++)
                    {
                        ProjectInfo projectInfo = listProjectInfo[i];

                        if (projectInfo != null && projectInfo.IsValid &&
                            context.IsTarget(projectInfo.ProjectGuid))
                        {
                            ProjectSection projectSection = context.GetProjectSection(
                                projectInfo.ProjectGuid);
                            if (projectSection == null)
                            {
                                projectSection = CreateSection(context, projectInfo);
                            }

                            if (projectSection != null)
                            {
                                projectSections.Add(projectSection);
                                context.RegisterSection(projectSection);
                            }
                        }
                    }
                }
            }
            else
            {
                ProjectSection projectSection = CreateSection(context, sourceFile);

                if (projectSection != null)
                {
                    projectSections.Add(projectSection);
                    context.RegisterSection(projectSection);
                }
            }

            return(projectSections);
        }
        public override bool Parse(ProjectSectionContext context, string projectFile)
        {
            if (!base.Parse(context, projectFile))
            {
                return(false);
            }

            // The platform and configuration information are provided by the
            // user for the Visual C++ projects...
            this.Platform      = context.ActivePlatform;
            this.Configuration = context.ActiveConfiguration;

            bool isSuccessful = this.ValidateConfigurations();

            if (!isSuccessful)
            {
                return(false);
            }

            isSuccessful = this.ParseProperties();
            if (!isSuccessful)
            {
                // If not successful, we try parsing "Choose" elements, since the ff.
                // is equally valid as conditioned property group....

                //<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
                //    <PropertyGroup>
                //        <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
                //        <OutputType>Exe</OutputType>
                //        <RootNamespace>Application1</RootNamespace>
                //        <AssemblyName>Application1</AssemblyName>
                //        <WarningLevel>4</WarningLevel>
                //    </PropertyGroup>
                //    <Choose>
                //        <When Condition=" '$(Configuration)'=='debug' ">
                //            <PropertyGroup>
                //                <OutputPath>.\bin\Debug\</OutputPath>
                //            </PropertyGroup>
                //        </When>
                //        <When Condition=" '$(Configuration)'=='retail' ">
                //            <PropertyGroup>
                //                <OutputPath>.\bin\Release\</OutputPath>
                //            </PropertyGroup>
                //        </When>
                //        <Otherwise>
                //            <PropertyGroup>
                //                <OutputPath>.\bin\$(Configuration)\</OutputPath>
                //            </PropertyGroup>
                //        </Otherwise>
                //    </Choose>
                //</Project>

                isSuccessful = this.ParseChoose();
            }

            if (!isSuccessful)
            {
                isSuccessful = this.ParseDefaults();
            }

            if (!isSuccessful)
            {
                return(isSuccessful);
            }

            List <ProjectInfo> referencedProjects = new List <ProjectInfo>();

            isSuccessful = this.ParseReferenceItems(referencedProjects);

            this.CreateChildren(referencedProjects);

            return(isSuccessful);
        }
        private bool ParseDefaults()
        {
            if (!String.IsNullOrEmpty(this.OutputFile) &&
                File.Exists(this.OutputFile))
            {
                // Possibility: The documentation file is explicitly defined

                //<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
                //  <ClCompile/>
                //  </ClCompile>
                //  <Link/>
                //  <Xdcmake>
                //    <OutputFile>Debug\TestingCPP3.xml</OutputFile>
                //  </Xdcmake>
                //</ItemDefinitionGroup>

                ICollection <ProjectItemDefinitionGroupElement> itemDefGroups =
                    this.Project.ItemDefinitionGroups;

                foreach (ProjectItemDefinitionGroupElement itemDefGroup
                         in itemDefGroups)
                {
                    if (IsConditionMatched(this.Configuration, this.Platform,
                                           itemDefGroup.Condition))
                    {
                        bool isFound = false;

                        foreach (ProjectItemDefinitionElement itemDef
                                 in itemDefGroup.ItemDefinitions)
                        {
                            if (String.Equals(itemDef.ItemType, "Xdcmake",
                                              StringComparison.OrdinalIgnoreCase))
                            {
                                foreach (ProjectMetadataElement metadata
                                         in itemDef.Metadata)
                                {
                                    if (!String.Equals(metadata.Name, "OutputFile",
                                                       StringComparison.OrdinalIgnoreCase))
                                    {
                                        continue;
                                    }

                                    string tempValue = metadata.Value;
                                    if (String.IsNullOrEmpty(tempValue))
                                    {
                                        continue;
                                    }
                                    tempValue = this.EvaluateMacros(tempValue);

                                    if (Path.IsPathRooted(tempValue))
                                    {
                                        this.CommentFile = Path.GetFullPath(tempValue);
                                    }
                                    else
                                    {
                                        this.CommentFile = Path.GetFullPath(
                                            Path.Combine(this.ProjectDir, tempValue));
                                    }

                                    isFound = true;
                                    break;
                                }
                            }

                            if (isFound)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            else
            {
                // Possibility: Default output directories are used...
                // $(SolutionDir)$(Configuration)\$(ProjectName)

                ProjectSectionContext context = this.Context;
                string workingDir             = Path.Combine(context.SolutionDir,
                                                             this.Configuration);

                if (Directory.Exists(workingDir))
                {
                    if (String.IsNullOrEmpty(this.OutputPath))
                    {
                        this.OutputPath = workingDir;
                    }

                    switch (this.OutputType.ToLower())
                    {
                    case "library":
                    case "dynamiclibrary":
                        this.OutputFile = Path.GetFullPath(Path.Combine(
                                                               workingDir, this.AssemblyName + ".dll"));
                        break;

                    case "exe":
                    case "application":
                        this.OutputFile = Path.GetFullPath(Path.Combine(
                                                               workingDir, this.AssemblyName + ".exe"));
                        break;
                    }

                    if (String.IsNullOrEmpty(this.CommentFile) || !File.Exists(this.CommentFile))
                    {
                        this.CommentFile = Path.GetFullPath(Path.Combine(
                                                                workingDir, this.AssemblyName + ".xml"));
                    }
                }
            }

            //if (this.IsTarget)
            //{
            //    // It is an referenced project and is normally used as dependency.
            //    // For this, only the assembly file is required...
            //    return (!String.IsNullOrEmpty(this.OutputFile) && File.Exists(this.OutputFile));
            //}
            //else
            //{
            //    // It is an outer project, and must have both assembly and comment
            //    // to be valid...
            //    return ((!String.IsNullOrEmpty(this.OutputFile) && File.Exists(this.OutputFile))
            //        && (!String.IsNullOrEmpty(this.CommentFile) && File.Exists(this.CommentFile)));
            //}

            return(!String.IsNullOrEmpty(this.OutputFile) && File.Exists(this.OutputFile));
        }
示例#10
0
        public override bool Parse(ProjectSectionContext context, string projectFile)
        {
            if (!base.Parse(context, projectFile))
            {
                return(false);
            }

            // The platform and configuration information are provided by the
            // user for the Visual C++ projects...
            this.Platform      = context.ActivePlatform;
            this.Configuration = context.ActiveConfiguration;

            // Open the project for parsing...
            _project = VcProjectRootElement.Open(projectFile);
            if (_project == null)
            {
                return(false);
            }

            _version = new Version(_project.Version);

            string tempText = _project.TargetFrameworkVersion;

            if (String.IsNullOrEmpty(tempText))
            {
                // Project files for VC++ 2003/2005 do not have the TargetFrameworkVersion
                // attribute, so we use the project version information...
                switch (_version.Major)
                {
                case 8:     // VS.NET 2005 and supports only .NET 2.0
                    this.TargetFrameworkVersion = "v2.0";
                    break;

                case 7:                                            // VS.NET 2002 or 2003 and support .NET 1.0 or 1.1
                    this.TargetFrameworkVersion = (_version.Minor == 1) ?
                                                  "v1.1" : "v1.0"; // VC++ 2002 is not yet tested
                    break;

                default:
                    throw new InvalidDataException(String.Format(
                                                       "The target framework version '{0}' is not known.", tempText));
                }
            }
            else
            {
                //TODO: Still could not find any reference for these version
                //      numbers, using the known values...
                switch (tempText.Trim())
                {
                case "196613":
                    this.TargetFrameworkVersion = "v3.5";
                    break;

                case "196608":
                    this.TargetFrameworkVersion = "v3.0";
                    break;

                case "131072":
                    this.TargetFrameworkVersion = "v2.0";
                    break;

                default:
                    throw new InvalidDataException(String.Format(
                                                       "The target framework version '{0}' is not known.", tempText));
                }
            }

            string targetIdentifer = _project["Keyword"];

            if (String.Equals(targetIdentifer, "ManagedCProj",
                              StringComparison.OrdinalIgnoreCase))
            {
                this.TargetFrameworkIdentifier = ".NETFramework";
            }
            else
            {
                this.TargetFrameworkIdentifier = targetIdentifer;
            }
            this.ProjectName = _project.Name;
            this.ProjectGuid = _project.ProjectGUID;

            bool isSuccessful = this.ValidatePlatforms();

            if (!isSuccessful)
            {
                throw new InvalidOperationException(
                          "The specified platform is not available.");
            }

            isSuccessful = this.ParseConfigurations();

            if (!isSuccessful)
            {
                return(isSuccessful);
            }

            List <ProjectInfo> referencedProjects = new List <ProjectInfo>();

            isSuccessful = this.ParseReferenceItems(referencedProjects);

            this.CreateChildren(referencedProjects);

            return(isSuccessful);
        }