ms构建引擎查找现有项目或删除重复项目

时间:2010-02-22 20:56:46

标签: msbuild code-generation

我目前正在开发一个生成C#代码文件的应用程序,并将它们添加到现有项目中。要编辑项目,我正在使用Microsoft.Build.BuildEngine,并将现有的.csproj文件加载到Project类中。

csproj = new Project(new Engine(),"3.5");
csproj.Load("/myproject.csproj");   

之后,我可以根据需要添加参考和编译项目。但是我不知道文件或引用是否已经存在于.csproj文件中,因此目前它们会被多次添加,这是我不想要的。

例如:

    <Reference Include="System" />
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Core" />

在我将项目添加到项目之前,是否有人知道我可以检查构建项是否存在?或者在我添加后删除重复的构建项的方法?

1 个答案:

答案 0 :(得分:0)

您可以遍历项目对象的EvaluatedItems

此示例代码演示了如何在添加builditem之前检查它是否存在:

// Create a new Engine object.
Engine engine = new Engine(Environment.CurrentDirectory);

// Create a new Project object.
Project csproj = new Project(new Engine(),"3.5");
csproj.Load("/myproject.csproj"); 

BuildItemGroup referenceItemGroup;
var currentReferences = new HashSet<string>();

// Iterate through each ItemGroup in the Project.
foreach (BuildItemGroup ig in csproj.ItemGroups)
{ 
  // Iterate through each Item in the ItemGroup.
  foreach (BuildItem item in ig)
  {
    if (item.Name == "Reference")
    {
      currentReferences.Add(item.Include);
      referenceItemGroup = ig;
    }
  }
}

// Add only non existing reference
if (!currentReferences.Contains("NewReferenceToAdd"))
{
  if (referenceItemGroup != null)
  {
    referenceItemGroup.AddNewItem("Reference", "IncludeValue");
  }
}

这一个如何删除重复项

// Create a new Engine object.
Engine engine = new Engine(Environment.CurrentDirectory);

// Create a new Project object.
Project csproj = new Project(new Engine(),"3.5");
csproj.Load("/myproject.csproj"); 

var currentReferences = new HashSet<string>();

// Iterate through each ItemGroup in the Project.
foreach (BuildItemGroup ig in csproj.ItemGroups)
{
  var itemsToRemove = new List<BuildItem>;

  // Iterate through each Item in the ItemGroup.
  foreach (BuildItem item in ig)
  {
    if (item.Name == "Reference")
    {
      if (currentReferences.Contains(item.Include))
      {
        itemsToRemove.Add(item);
      }
      else
      {
        currentReferences.Add(item.Include);
      }
    }
  }

  // Remove duplicate items
  foreach (BuildItem itemToRemove in itemsToRemove)
  {
    ig.RemoveItem(itemToRemove);
  }
}