2009-07-27 19 views
24

Herkes bir VS2008 csproj dosyasındaki Referanslar listesini programsal olarak okumak için bir yol biliyor mu? MSBuild bu işlevselliği destekliyor görünmüyor. Ben csproj dosyasını bir XmlDocument içine yükleyerek düğümleri okumaya çalışıyorum ama XPath arama herhangi bir düğüm döndürmez. Ben o Referans bilgileri içerir olmadığını belirleyebilir ItemGroups listesini alabilirsiniz Eğercsproj dosyalarından Kaynaklar listesini okuma

System.Xml.XmlDocument projDefinition = new System.Xml.XmlDocument(); 
     projDefinition.Load(fullProjectPath); 

     System.Xml.XPath.XPathNavigator navigator = projDefinition.CreateNavigator(); 

     System.Xml.XPath.XPathNodeIterator iterator = navigator.Select(@"/Project/ItemGroup"); 
     while (iterator.MoveNext()) 
     { 
      Console.WriteLine(iterator.Current.Name); 
     } 

: Aşağıdaki kodu kullanıyorum.

cevap

37

XPath, /Project/ItemGroup/Reference olmalıdır ve ad alanını unutmuşsunuzdur. Ben sadece XLINQ kullanıyorum - XPathNavigator ad alanlarıyla uğraşmak oldukça dağınık. Yani: @Pavel Minaev cevabı üzerine

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
    XDocument projDefinition = XDocument.Load(fullProjectPath); 
    IEnumerable<string> references = projDefinition 
     .Element(msbuild + "Project") 
     .Elements(msbuild + "ItemGroup") 
     .Elements(msbuild + "Reference") 
     .Select(refElem => refElem.Value); 
    foreach (string reference in references) 
    { 
     Console.WriteLine(reference); 
    } 
+0

Bu çok daha kolaydı. Yardım için teşekkürler. –

+0

Bu harika! Artık herkes bunu fark etti, ama her ihtimale karşı - çözüm içinde de referanslar yapılabildi, bu durumda 'ProjectReference' öğesini de almanız gerekiyor. – astrowalker

6

Yapı, bu ben de

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
    XDocument projDefinition = XDocument.Load(@"D:\SomeProject.csproj"); 
    IEnumerable<string> references = projDefinition 
     .Element(msbuild + "Project") 
     .Elements(msbuild + "ItemGroup") 
     .Elements(msbuild + "Reference") 
     .Attributes("Include") // This is where the reference is mentioned  
     .Select(refElem => refElem.Value); 
    foreach (string reference in references) 
    { 
     Console.WriteLine(reference); 
    } 
4

@ PavelMinaev cevabı dayanarak (özniteliği içerir okumak için eklenen .Attributes satır fark) benim için çalıştı ne "HintPath" Öğesini çıktıya ekledi. Dize dizisini "başvurular" ı ".txt" dosyasına yazdım.

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
      XDocument projDefinition = XDocument.Load(@"C:\DynamicsFieldsSite.csproj"); 
      var references = projDefinition 
       .Element(msbuild + "Project") 
       .Elements(msbuild + "ItemGroup") 
       .Elements(msbuild + "Reference") 
       .Select(refElem => (refElem.Attribute("Include") == null ? "" : refElem.Attribute("Include").Value) + "\n" + (refElem.Element(msbuild + "HintPath") == null ? "" : refElem.Element(msbuild + "HintPath").Value) + "\n"); 
      File.WriteAllLines(@"C:\References.txt", references);