2012-05-30 12 views
6

Tengo algunos proyectos en una solución de Visual Studio que han terminado con referencias de proyecto que incluyen un GUID incorrecto para el proyecto al que se hace referencia. (Posiblemente debido a que el proyecto al que se hace referencia se está recreando en algún momento)Resolución de GUID de referencia de proyecto incorrectos

por ejemplo. Considere un CoreProject.csproj proyecto con las siguientes propiedades:

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

Otro proyecto incluye una referencia a esto, pero en algún momento el GUID ha cambiado y ahora es incorrecta.

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

La solución todavía cargas y construye correctamente en Visual Studio y msbuild, pero sospecho que tiene los GUID equivocadas puede tener algún impacto en el rendimiento dentro de VS.

La solución es bastante grande con muchos proyectos que tienen este problema, y ​​prefiero no tener que volver a agregar estas referencias manualmente. ¿Existen herramientas o macros que puedan 'arreglar' los GUID de referencia del proyecto?

Respuesta

7

creo una aplicación básica de la consola debe hacer el truco, algo como esto:

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

muy buena. Sin embargo, sugeriría cambiar 'if (meta! = Guid)' a 'if (! Meta.Equals (guid, StringComparison.InvariantCultureIgnoreCase))', ya que las guids son a veces minúsculas y, a veces en mayúsculas. –

Cuestiones relacionadas