@ BrianKretzler совершенно точно использует ITaskItem, поскольку именно MSBuild использует его, когда вы объявляете <ItemGroup>
.
Я просто хотел привести ответ полным рабочим примером, так как я нашел этот пост, когда пытался выполнить то же самое, и он помог мне.(Очень сложно найти эти проблемы, потому что ключевые слова используются в разных контекстах, поэтому, надеюсь, это поможет кому-то еще).
<UsingTask TaskName="MyCustomTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<SomeStrings ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
</ParameterGroup>
<Task>
<Code Type="Class" Language="cs"><![CDATA[
using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class MyCustomTask : Task
{
public ITaskItem[] SomeStrings { get; set; }
public override bool Execute()
{
foreach (var item in SomeStrings)
{
Log.LogMessage(MessageImportance.High,
"Got item {0}",
item.ItemSpec);
Log.LogMessage(" -> {0} -> {1}",
item.GetMetadata("Comparison"),
item.GetMetadata("MoreDetail"));
}
return true;
}
}
]]></Code>
</Task>
</UsingTask>
Теперь вы можете вызывать эту задачу с помощью:
<Target Name="DoSomething">
<ItemGroup>
<SomeStrings Include="first string">
<Comparison>first</Comparison>
</SomeStrings>
<SomeStrings Include="second string">
<Comparison>2nd</Comparison>
<MoreDetail>this is optional</MoreDetail>
</SomeStrings>
</ItemGroup>
<MyCustomTask SomeStrings="@(SomeStrings)" />
</Target>
, и вы получите:
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.269]
Copyright (C) Microsoft Corporation 2007. All rights reserved.
Build started 2012-10-19 5:41:22 PM.
Got first string
-> first ->
Got second string
-> 2nd -> this is optional
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:00.12
Конечно, вы также можете использовать что-то вроде <ItemGroup><SomeStrings Include="**\*.txt" /></ItemGroup>
и вы получите список имен файлов, которые совпадают, и, конечно, вы можете использовать GetMetadata () для доступа к общеизвестным метаданным файла