8

定義済みのすべてのプロパティ (予約されていないもの) を出力するカスタム タスクを作成する必要があります。したがって、私の C# コードでは、MSBuild エンジンのプロパティ リストにアクセスしたいのですが、その方法がわかりません。助けてください。

4

2 に答える 2

7

前の例では、プロジェクト ファイルがロックされます。これにより、問題が発生する場合があります。たとえば、同じプロジェクト ファイルでタスクを数回呼び出すとします。改善されたコードは次のとおりです。

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;
            }
        }
    }
}
于 2010-11-25T21:43:29.983 に答える
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;
        }
    }
}
于 2010-05-05T12:22:43.597 に答える