从csproj文件中读取引用列表

有没有人知道以编程方式读取VS2008 csproj文件中的引用列表的方法? MSBuild似乎不支持此function。 我试图通过将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列表,我可以确定它是否包含参考信息。

XPath应该是/Project/ItemGroup/Reference ,你忘记了命名空间。 我只是使用XLINQ – 在XPathNavigator处理命名空间是相当混乱的。 所以:

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

基于@Pavel Minaev的回答,这对我有用(注意添加的.Attributes行来读取Include属性)

 XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; XDocument projDefinition = XDocument.Load(@"D:\SomeProject.csproj"); IEnumerable 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); } 

根据@ PavelMinaev的回答,我还在输出中添加了“HintPath”元素。 我将字符串数组“references”写入“.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);