2012-05-30 17 views
6

मेरे पास विजुअल स्टूडियो समाधान में कुछ प्रोजेक्ट हैं जो प्रोजेक्ट संदर्भों के साथ समाप्त हो गए हैं जिसमें संदर्भित परियोजना के लिए गलत GUID शामिल है। (शायद किसी संदर्भ में संदर्भित परियोजना को पुनर्निर्मित किया जा रहा है)गलत प्रोजेक्ट संदर्भ GUIDs को हल करना

उदाहरण के लिए। निम्नलिखित गुण के साथ एक परियोजना 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> 

समाधान अभी भी लोड और दृश्य स्टूडियो और MSBuild में सही ढंग से बनाता है, लेकिन मैं गलत GUIDs होने बनाम भीतर कुछ प्रदर्शन प्रभाव हो सकता है पर शक

समाधान इस समस्या के साथ कई परियोजनाओं के साथ काफी बड़ा है, और मैं इन संदर्भों को मैन्युअल रूप से दोबारा जोड़ना नहीं चाहता हूं। क्या कोई उपकरण या मैक्रोज़ है जो परियोजना संदर्भ GUID को 'ठीक' कर सकता है?

उत्तर

7

मुझे लगता है कि एक बुनियादी सांत्वना अनुप्रयोग इस तरह चाल, कुछ करना चाहिए:

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

बहुत अच्छा। मैं बदलना चाहता हूं 'अगर (मेटा! = Guid) 'to' if (! Meta.Equals (guid, StringComparison.InvariantCultureIgnoreCase)) हालांकि, चूंकि कभी-कभी गुड्स कम-मामले और कभी-कभी ऊपरी-मामले होते हैं। –

संबंधित मुद्दे