2010-02-22 127 views
0

我目前正在研究生成C#代码文件并将其添加到现有项目的应用程序。编辑项目我使用Microsoft.Build.BuildEngine,并将现有的.csproj文件加载到Project类中。ms构建引擎查找现有项目或删除重复项目

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

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

例如:

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

有谁知道的一种方法,我可以检查是否存在builditem之前,我将它添加到项目中?或者在添加完成后删除重复构建项的方法?

回答

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); 
    } 
}