在c#msbuild任务中检索具有相同名称的多个项元数据

时间:2009-03-26 09:18:44

标签: c# msbuild msbuild-task

如何在c#msbuild任务中获取具有相同名称的多个项目元数据,例如,如果我有:

 <ItemGroup>    
   <Assemblies Include = "S:\SVN\SomeDirectory\src\">
     <excludeAssembly>AssemblyName_1</excludeAssembly>
     <excludeAssembly>AssemblyName_2</excludeAssembly>
     <excludeAssembly>AssemblyName_3</excludeAssembly>
     <excludeAssembly>AssemblyName_4</excludeAssembly>
   </Assemblies>
 </ItemGroup>

如果通常会使用以下内容,我将如何获得所有<excludeAssembly>元数据的列表:

var itemData = itemTask.GetMetadata("excludeAssembly")

获取单个元数据值。我需要获取<excludeAssembly>

的列表

1 个答案:

答案 0 :(得分:2)

元数据与item不同,您可以为一个项目设置不同的metadatas,但只为元数据设置一个值。

在Microsoft.Build.Engine程序集( BuildItem.EvaluateAllItemMetadata(...))上使用Reflector,您会看到项目的元数据存储在Dictionnary中,因此对于给定的元数据名称,您只能有一个值。

您的案例中的解决方法是使用元数据作为项目的名称,如下所示:

<ItemGroup>    
  <Assemblies Include = "S:\SVN\SomeDirectory\src\">
    <excludeAssembly>exludeAssemblySet</excludeAssembly>
  </Assemblies>
</ItemGroup>

<ItemGroup>
  <exludeAssemblySet Include="AssemblyName_1"/>
  <exludeAssemblySet Include="AssemblyName_2"/>
  <exludeAssemblySet Include="AssemblyName_3"/>
  <exludeAssemblySet Include="AssemblyName_4"/>
</ItemGroup>

// Approximative syntax, I don't know what you want to do
var itemData = itemTask.GetMetadata("excludeAssembly");
BuildItemGroup excludeAssemblies = project.GetEvaluatedItemsByName(itemData);