How to access the MSBuild 's properties list when coding a custom task?

前端 未结 2 1690
青春惊慌失措
青春惊慌失措 2020-12-10 16:26

I need to write a custom task that print all the defined properties (the non-reserved ones). So in my C# code, I wanna access to the properties list of MSBuild engine and I

相关标签:
2条回答
  • 2020-12-10 16:44

    Using .NET 4 :

    using Microsoft.Build.Evaluation;
    using Microsoft.Build.Utilities;
    
    namespace MSBuildTasks
    {
        public class GetAllProperties : Task
        {
            public override bool Execute()
            {
                Project project = new Project(BuildEngine.ProjectFileOfTaskNode);
                foreach(ProjectProperty evaluatedProperty in project.AllEvaluatedProperties)
                {
                    if(!evaluatedProperty.IsEnvironmentProperty &&
                        !evaluatedProperty.IsGlobalProperty &&
                        !evaluatedProperty.IsReservedProperty)
                    {
                        string name = evaluatedProperty.Name;
                        string value = evaluatedProperty.EvaluatedValue;
                    }
    
                    // Do your stuff
                }
    
                return true;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-10 16:52

    The previous example will lock you project file. This may cause problems. For example if you call the task several times in the same project file. Here is improved code:

    using System.Xml;
    using Microsoft.Build.Evaluation;
    using Microsoft.Build.Utilities;
    
    namespace MSBuildTasks
    {
        public class GetAllProperties : Task
        {
            public override bool Execute()
            {
                using(XmlReader projectFileReader = XmlReader.Create(BuildEngine.ProjectFileOfTaskNode))
                {
                    Project project = new Project(projectFileReader);
    
                    foreach(ProjectProperty property in project.AllEvaluatedProperties)
                    {
                        if(property.IsEnvironmentProperty) continue;
                        if(property.IsGlobalProperty) continue;
                        if(property.IsReservedProperty) continue;
    
                        string propertyName = property.Name;
                        string propertyValue = property.EvaluatedValue;
    
                        // Do your stuff
                    }
    
                    return true;
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题