6

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 を「修正」できるツールまたはマクロはありますか?

4

1 に答える 1

9

次のような基本的なコンソールアプリでうまくいくと思います:

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);
        }
    }
}
于 2012-05-30T20:05:22.810 に答える