How to access the MSBuild 's properties list w

2019-01-19 03:00发布

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 don't know how. Please help.

2条回答
来,给爷笑一个
2楼-- · 2019-01-19 03:16

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;
    }
  }
}
查看更多
时光不老,我们不散
3楼-- · 2019-01-19 03:36

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;
      }
    }
  }
}
查看更多
登录 后发表回答