2009-07-27 5 views
24

Kennt jemand eine Möglichkeit, die Liste der Verweise in einer VS2008-CSproj-Datei programmgesteuert zu lesen? MSBuild scheint diese Funktionalität nicht zu unterstützen. Ich versuche, die Knoten zu lesen, indem Sie die Csproj-Datei in einem XmlDocument laden, aber die XPath-Suche gibt keine Knoten zurück. Ich verwende den folgenden Code:Lesen der Liste der Referenzen aus csproj-Dateien

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

Wenn ich die Liste der ItemGroups bekommen kann ich feststellen kann, ob es Referenzinformationen enthält oder nicht.

Antwort

37

Der XPath sollte /Project/ItemGroup/Reference sein, und Sie haben den Namespace vergessen. Ich würde einfach XLINQ verwenden - Umgang mit Namespaces in XPathNavigator ist ziemlich chaotisch. Also:

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

Das war viel einfacher. Danke für die Hilfe. –

+0

Das ist großartig! Inzwischen ist es wahrscheinlich allen aufgefallen, aber nur für den Fall - Referenzen können auch innerhalb der Lösung gemacht werden, in diesem Fall müssen Sie auch das 'ProjectReference' Element erhalten. – astrowalker

6

Aufbauend auf @Pavel Minaev Antwort, das ist was für mich gearbeitet (man beachte die hinzugefügt .Attributes Zeile lesen das Attribut 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

Basierend auf @ PavelMinaev Antwort, habe ich auch Das "HintPath" -Element wurde zur Ausgabe hinzugefügt. Ich schreibe das String-Array "references" in eine ".txt" -Datei.

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