Reputation: 35444
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.
Upvotes: 10
Views: 4046
Reputation: 141
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;
}
}
}
}
Upvotes: 6
Reputation: 50000
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;
}
}
}
Upvotes: 3