我目前正在开发一个生成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" />
在我将项目添加到项目之前,是否有人知道我可以检查构建项是否存在?或者在我添加后删除重复的构建项的方法?
答案 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);
}
}