Чтение списка ссылок из файлов csproj
Кто-нибудь знает способ программного просмотра списка ссылок в файле VS2008 csproj? MSBuild, похоже, не поддерживает эту функцию. Я пытаюсь прочитать узлы, загружая файл csproj в XmlDocument, но поиск XPath не возвращает никаких узлов. Я использую следующий код:
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);
}
Если я могу получить список ItemGroups, я могу определить, содержит ли он справочную информацию или нет.
Ответы
Ответ 1
XPath должен быть /Project/ItemGroup/Reference
, и вы забыли пространство имен. Я бы просто использовал XLINQ - работа с пространствами имен в XPathNavigator
довольно беспорядочна. Итак:
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);
}
Ответ 2
Основываясь на ответе @Pavel Minaev, это то, что сработало для меня (обратите внимание на добавленную строку .Attributes, чтобы прочитать атрибут 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);
}
Ответ 3
Основываясь на ответе @PavelMinaev, я также добавил элемент "HintPath" к выходу. Я пишу строковый массив "ссылки" в файл ".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);
Ответ 4
Этот подход работает только при запуске из Visual Studio, если код, опубликованный и развернутый на сервере, не найдет файл csproj в пакете.