2012-05-30 15 views
6

Ho alcuni progetti in una soluzione di Visual Studio che hanno finito con riferimenti del progetto che includono il torto GUID per il progetto di riferimento. (Forse a causa del progetto di riferimento essendo ricreato in qualche fase)Risoluzione GUID di riferimento del progetto errato

es. Si consideri un CoreProject.csproj progetto con le seguenti proprietà:

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

altro progetto include un riferimento a questo, ma a un certo punto il GUID è cambiato ed è ora corretto.

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

La soluzione ancora carichi e costruisce correttamente in Visual Studio e msbuild, ma ho il sospetto avendo i GUID sbagliate possono avere un certo impatto sulle prestazioni all'interno di VS.

La soluzione è abbastanza grande con molti progetti che presentano questo problema e preferirei non dover aggiungere nuovamente questi riferimenti manualmente. Ci sono strumenti o macro che puo 'risolvere' i GUID di riferimento del progetto?

risposta

7

penso che una console app di base dovrebbe fare il trucco, qualcosa di simile:

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

molto buona. Suggerirei di cambiare 'if (meta! = Guid)' a 'if (! Meta.Equals (guid, StringComparison.InvariantCultureIgnoreCase))' sebbene, dato che i guids sono a volte minuscoli e talvolta maiuscoli. –

Problemi correlati