【问题标题】:Resolving incorrect project reference GUIDs解决不正确的项目引用 GUID
【发布时间】:2012-06-04 18:44:39
【问题描述】:

我在 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?

【问题讨论】:

    标签: visual-studio-2010 msbuild project-reference


    【解决方案1】:

    我认为基本的控制台应用程序应该可以解决问题,如下所示:

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

    【讨论】:

    • 非常好。不过,我建议将 if (meta != guid) 更改为 if (!meta.Equals(guid, StringComparison.InvariantCultureIgnoreCase)),因为 guid 有时是小写的,有时是大写的。
    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    相关资源
    最近更新 更多