2009-07-27 6 views
24

Qualcuno conosce un modo per leggere a livello di codice l'elenco di riferimenti in un file csproj VS2008? MSBuild non sembra supportare questa funzionalità. Sto cercando di leggere i nodi caricando il file csproj in un XmlDocument ma, la ricerca XPath non restituisce alcun nodo. Sto utilizzando il seguente codice:Lettura dell'elenco di riferimenti da file csproj

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

Se posso ottenere l'elenco dei ItemGroups posso determinare se contiene informazioni Riferimento o no.

risposta

37

L'XPath deve essere /Project/ItemGroup/Reference e si è dimenticato lo spazio dei nomi. Mi piacerebbe usare XLINQ - trattare i namespace in XPathNavigator è piuttosto disordinato. Quindi:

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

Questo è stato molto più facile. Grazie per l'aiuto. –

+0

Questo è fantastico! Ormai tutti probabilmente lo hanno notato, ma per ogni evenienza - i riferimenti potrebbero essere fatti anche all'interno della soluzione, in tal caso è necessario anche ottenere l'elemento 'ProjectReference'. – astrowalker

6

Sulla risposta di @Pavel Minaev, questo è ciò che ha funzionato per me (notare la linea .Attributes aggiunto per leggere l'attributo Include)

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

Sulla base di @ PavelMinaev risposta, ho anche aggiunto l'elemento "HintPath" all'output. Scrivo l'array di stringhe "reference" in un file ".txt".

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);