2010-02-22 2 views
0

Je travaille actuellement sur une application qui génère des fichiers de code C# et les ajoute à un projet existant. Pour modifier le projet, j'utilise Microsoft.Build.BuildEngine et charge le fichier .csproj existant dans la classe Project. Après quoi je suis capable d'ajouter des refeneces et de compiler des articles comme j'en ai besoin. Cependant je ne sais pas si les fichiers ou les références sont déjà dans le fichier .csproj, donc actuellement ils sont ajoutés plusieurs fois, ce que je ne veux pas.ms Construire un moteur Rechercher un article existant ou supprimer des articles en double

par exemple:

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

Est-ce que quelqu'un sait d'une manière que je peux vérifier si un builditem existe avant d'ajouter au projet? Ou d'un moyen de supprimer les builditems dupliqués après les avoir ajoutés?

Répondre

0

Vous pouvez parcourir les EvaluatedItems de votre objet de projet

Ce code exemple montre comment vérifier builditem existence avant de l'ajouter:

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

Et celui-ci comment supprimer l'article doublons

// 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); 
    } 
} 
Questions connexes