如何在编写自定义任务时访问MSBuild的属性列表?

时间:2010-05-05 10:39:42

标签: msbuild msbuild-task

我需要编写一个自定义任务来打印所有已定义的属性(非保留属性)。所以在我的C#代码中,我想访问MSBuild引擎的属性列表,我不知道如何。请帮忙。

2 个答案:

答案 0 :(得分:6)

上一个示例将锁定项目文件。这可能会导致问题。例如,如果您在同一项目文件中多次调用该任务。这是改进的代码:

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;
      }
    }
  }
}

答案 1 :(得分:3)

使用.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;
    }
  }
}