ms Build Engine найти существующий элемент или удалить дубликаты - PullRequest
0 голосов
/ 22 февраля 2010

В настоящее время я работаю над приложением, которое генерирует файлы кода 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" />

Кто-нибудь знает, как я могу проверить, существует ли builditem, прежде чем я добавлю его в проект? Или как удалить дубликаты сборочных элементов после их добавления?

1 Ответ

0 голосов
/ 23 февраля 2010

Вы можете перебирать EvaluatedItems вашего объекта Project

Этот пример кода демонстрирует, как проверить существование 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);
  }
}
...