visual-studio-2010 - 解决不正确的项目引用 GUID

标签 visual-studio-2010 msbuild project-reference

我在 Visual Studio 解决方案中有一些项目,这些项目最终的项目引用包含引用项目的错误 GUID。 (可能是由于在某个阶段重新创建了引用的项目)

例如。考虑具有以下属性的项目 CoreProject.csproj:

<ProjectGuid>{93803F9C-8C65-4949-8D44-AB7A3D0452C8}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>CoreProject</RootNamespace>
<AssemblyName>CoreProject</AssemblyName>

另一个项目包含对此的引用,但在某个阶段 GUID 已更改,现在不正确。
<ProjectReference Include="..\CoreProject\CoreProject.csproj">
  <Project>{5FD52517-79F8-41D2-B6F2-EA2D8A886549}</Project>
  <Name>CoreProject</Name>
</ProjectReference>

该解决方案仍然可以在 Visual Studio 和 msbuild 中正确加载和构建,但我怀疑有错误的 GUID 可能会对 VS 中的性能产生一些影响。

该解决方案非常大,许多项目都有这个问题,我不想手动重新添加这些引用。是否有任何工具或宏可以“修复”项目引用 GUID?

最佳答案

我认为一个基本的控制台应用程序应该可以解决这个问题,就像这样:

using System;
using System.IO;
using System.Linq;
using Microsoft.Build.Evaluation;

public class Program
{
    public static void Main(String[] args)
    {
        var projects = Directory.EnumerateFiles(@"...", "*.csproj", SearchOption.AllDirectories)
            .Select(x =>
                    {
                        try
                        {
                            return new Project(x);
                        }
                        catch
                        {
                            return null;
                        }
                    })
            .Where(x => x != null)
            .ToList();
        var guids = projects.ToDictionary(p => p.FullPath, p => p.GetPropertyValue("ProjectGuid"));

        foreach (var project in projects)
        {
            var save = false;

            foreach (var reference in project.GetItems("ProjectReference"))
            {
                var path = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(project.FullPath), reference.EvaluatedInclude));
                if (!guids.ContainsKey(path))
                {
                    Console.WriteLine("No {0}", Path.GetFileName(path));
                    continue;
                }

                var guid = guids[path];
                var meta = reference.GetMetadataValue("Project");
                if (meta != guid)
                {
                    Console.WriteLine("{0} -> {1}", meta, guid);
                    reference.SetMetadataValue("Project", guid);
                    save = true;
                }
            }

            if (save)
                project.Save(project.FullPath);
        }
    }
}

关于visual-studio-2010 - 解决不正确的项目引用 GUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10817857/

相关文章:

c++ - 获取 lambda 参数类型

entity-framework - 由于无法解析 Entity Framework 引用,Visual Studio Online 无法构建项目

c# - LibVLC 依赖项应该添加到哪个项目?

c# - VS2010 : Warning on add project reference to Silverlight project from . 网络项目

带有第三方库的 Typescript 3 项目引用(来自 npm)

使用 decltype(var) 后跟内部类型 "var"时出现 C++11 编译器错误

使用 shared_ptr 作为参数时的 C++/CLI "could not import member"警告

jenkins - 为什么 MSbuild 不使用 Jenkins 在单个操作中构建多个项目?

c# - 无法加载文件或程序集 'Microsoft.Build.Framework' (VS 2017)

visual-studio - 在 IIS 6 上部署 Asp.Net MVC 2/C# 4.0 应用程序