Lesen Sie die Liste der Referenzen aus CSProj -Dateien
Frage
Kennt jemand eine Möglichkeit, die Liste der Referenzen in einer VS2008 CSPROJ -Datei programmatisch zu lesen? MSBuild scheint diese Funktionalität nicht zu unterstützen. Ich versuche, die Knoten zu lesen, indem ich die CSPROJ -Datei in ein XMLDOCUMEN lade, aber die XPath -Suche gibt keine Knoten zurück. Ich verwende den folgenden Code:
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 Elementgruppen erhalten kann, kann ich feststellen, ob sie Referenzinformationen enthält oder nicht.
Lösung
Der XPath sollte sein /Project/ItemGroup/Reference
, und du hast den Namespace vergessen. Ich würde einfach Xlinq verwenden - den Umgang mit Namespaces in XPathNavigator
ist ziemlich chaotisch. So:
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);
}
Andere Tipps
Aufbauend auf der Antwort von @Pavel Minaev hat dies für mich funktioniert (beachten Sie die hinzugefügte Zeile.
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);
}
Basierend auf der Antwort von @pavelminaev habe ich auch das "HintPath" -Element zur Ausgabe hinzugefügt. Ich schreibe das String -Array "Referenzen" zu einer ".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);