2012-05-30 18 views
6

Ich habe einige Projekte in einer Visual Studio-Lösung, die mit Projektverweisen enden, die die falsche GUID für das referenzierte Projekt enthalten. (Möglicherweise aufgrund des referenzierten Projekts, das zu einem bestimmten Zeitpunkt neu erstellt wurde)Auflösen falscher Projektreferenz-GUIDs

z. Betrachten wir ein Projekt CoreProject.csproj mit den folgenden Eigenschaften:

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

Ein weiteres Projekt enthält einen Verweis auf das, aber irgendwann hat die GUID geändert und ist jetzt falsch.

<ProjectReference Include="..\CoreProject\CoreProject.csproj"> 
    <Project>{5FD52517-79F8-41D2-B6F2-EA2D8A886549}</Project> 
    <Name>CoreProject</Name> 
</ProjectReference> 

Die Lösung nach wie vor Belastungen und baut korrekt in Visual Studio und msbuild, aber ich vermute, die falschen GUIDs haben, können einige Auswirkungen auf die Leistung innerhalb VS. haben

Die Lösung ist sehr groß mit vielen Projekten, die dieses Problem haben, und ich möchte diese Referenzen nicht manuell hinzufügen müssen. Gibt es Werkzeuge oder Makros, die die Referenz-GUIDs des Projekts 'reparieren' können?

Antwort

7

Ich denke, eine Grundkonsole App den Trick tun sollte, so etwas wie dieses:

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

Sehr gut. Ich würde vorschlagen, 'if (meta! = Guid)' in 'if (! Meta.Equals (guid, StringComparison.InvariantCultureIgnoreCase))' zu ändern, obwohl die Guids manchmal in Klein- und manchmal in Großbuchstaben sind. –