Some time, we want to pass parameter including Special Characters to Msbuild, for example,
<PropertyGroup>
<CAR>+!Microsoft.Performance#CA1812;+!Microsoft.Performance#CA1822</CAR>
<CustomPropertiesForBuild>
$(CustomPropertiesForBuild);CodeAnalysisRules=$(CAR)
</CustomPropertiesForBuild>
</PropertyGroup>
If the value is hardcode, it will work well. But when the property “CAR” is an output of a task, it will not work. For example,
<Target Name="BeforeCompileSolution">
<MyTask>
<Output TaskParameter="OutputList" PropertyName="CodeAnalysisRules" />
</MyTask>
<Message Text="CodeAnalysisRules=$(CodeAnalysisRules)"></Message>
<PropertyGroup>
<CustomPropertiesForBuild>CodeAnalysisRules=$(CodeAnalysisRules)</CustomPropertiesForBuild>
</PropertyGroup>
<Message Text="CustomPropertiesForBuild=$(CustomPropertiesForBuild)"></Message>
</Target>
We set the value of “OutputList” (type: String)to “+!Microsoft.Performance#CA1812;+!Microsoft.Performance#CA1822” in the dll. but the value that get in MSbuild is “CodeAnalysisRules=+!Microsoft.Performance#CA1812%3b+!Microsoft.Performance#CA1822” though <Message> Task show the correct value.
To Fix this issue, we can use itemgroup instead of property to get/set the value of CodeAnalysisRules.
Fist: in your code, using ITaskItem[] as output.
For Example :
public class MyTask : Task
{
[Output]
public ITaskItem[] OutputList { get; set; }
public override bool Execute()
{
var list = new List<ITaskItem>();
list.Add(new TaskItem("+!Microsoft.Performance#CA1812"));
list.Add(new TaskItem("+!Microsoft.Performance#CA1822"));
OutputList = list.ToArray();
return true;
}
}
Second: In TFSBuild.proj, use ItemName instead of PropertyName.
<Target Name="BeforeCompileSolution">
<MyTask>
<Output TaskParameter="OutputList" ItemName="CodeAnalysisRules" />
</MyTask>
<Message Text="CodeAnalysisRules=@(CodeAnalysisRules)"></Message>
<PropertyGroup>
<CustomPropertiesForBuild>CodeAnalysisRules=@(CodeAnalysisRules)</CustomPropertiesForBuild>
</PropertyGroup>
<Message Text="CustomPropertiesForBuild=$(CustomPropertiesForBuild)"></Message>
</Target>
Now, MSBuild will recognize it correctly.
CodeAnalysisRules=+!Microsoft.Performance#CA1812%3b+!Microsoft.Performance#CA1822