我最终使用类似于以下的自定义内联任务解决了这个问题:
<UsingTask
TaskName="GetMetadataTask"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup>
<MyItemGroup ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
<MetadataString Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System"/>
<Code Type="Fragment" Language="cs">
<![CDATA[
StringBuilder command = new StringBuilder();
foreach (ITaskItem item in MyItemGroup )
{
command.AppendFormat("ItemName={0}\r\n", item);
foreach (string parameter in item.MetadataNames)
{
command.AppendFormat(" {0}={1}\r\n", parameter, item.GetMetadata(parameter));
}
command.AppendFormat("\r\n");
}
MetadataString = command.ToString();
]]>
</Code>
</Task>
</UsingTask>
请注意,上述内容还将包括 MSBuild 自动添加到项目组中每个项目的所有默认元数据(如 FullPath、RootDir、文件名等)。在我的实现中,我添加了一个额外的检查来忽略那些我不关心的元数据项
示例用法:
<GetMetadataTask MyItemGroup="@(YourItemGroup)">
<Output TaskParameter="MetadataString" PropertyName="YourMetadataString"/>
</GetMetadataTask>
<Message Text="$(YourMetadataString)" />
若要在 Visual Studio 的“输出”窗口中查看消息输出,您可能需要将MSBuild 输出详细程度至少更改为“正常”。