Как получить доступ к списку свойств MSBuild при кодировании пользовательской задачи? - PullRequest
6 голосов
/ 05 мая 2010

Мне нужно написать пользовательское задание, которое печатает все определенные свойства (незарезервированные). Поэтому в моем коде на C # я хочу получить доступ к списку свойств движка MSBuild и не знаю как. Пожалуйста, помогите.

Ответы [ 2 ]

6 голосов
/ 26 ноября 2010

Предыдущий пример заблокирует ваш файл проекта. Это может вызвать проблемы. Например, если вы вызываете задачу несколько раз в одном и том же файле проекта. Вот улучшенный код:

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;
      }
    }
  }
}
3 голосов
/ 05 мая 2010

Использование .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;
    }
  }
}
...