28

有谁知道以编程方式读取 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 列表,我可以确定它是否包含参考信息。

4

3 回答 3

47

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);
    }
于 2009-07-27T23:24:01.277 回答
11

基于@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);
    }
于 2015-02-24T11:09:05.833 回答
4

根据@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);
于 2016-02-05T20:38:39.293 回答