0

我正在尝试删除一个引用并将其替换为多个 C# 项目的新引用。

如何使用 microsoft.build.evaluation 添加新参考

using Microsoft.Build.Evaluation;
var projCollection  =  new ProjectCollection();
var proj =  projCollection.LoadProject(csproj_filepath);

var items  = proj.GetItems("Reference");

foreach(var item in items)
{
 if(item. EvaluatedInclude.Equals("XYZ_reference"))
  {
   //remove this reference
   // add new reference with new hint path etc
  }
}
proj.Save();

这里有文档,但在有无元数据包含或使用示例之间的区别方面不是很有用。

4

1 回答 1

0

我不太明白问题到底是什么。例如:我的旧项目中的小片段,用于替换PackageReferenceProjectReference更轻松地在本地调试:

    private void SwitchExplicitPackage(MSProject.Project project, NugetPackage package, Dictionary<string, string> projects)
    {
        ProjectItem item = project.GetItemsByEvaluatedInclude(package.Identity).FirstOrDefault();

        if (item == null)
            return;

        /*
         * Metadata is needed for compatibility with classic projects.
         */

        MSProject.Project newProject = _projectHelper.GetLoadedProject(projects[package.Identity]);

        item.UnevaluatedInclude = projects[package.Identity];

        item.SetMetadataValue(REF_METADATA_PACKAGE, package.Identity);
        item.SetMetadataValue(REF_METADATA_PROJECT, newProject.GetPropertyValue("ProjectGuid"));
        item.SetMetadataValue(REF_METADATA_NAME   , newProject.GetPropertyValue("ProjectName"));

        item.ItemType = PROJECT_REF; // ProjectReference

        _journalHelper.AddMessage($"Explicit dependency { package.Identity } switched to { projects[package.Identity] }", TaskErrorCategory.Message);
    }

事实上,这一切都归结为找到所需的参考并替换属性。保存后,Visual Studio 检测到更改并请求重新加载项目,然后应用更改。

于 2020-06-21T11:20:53.920 回答