2009-07-27 2 views
24

누구든지 프로그래밍 방식으로 VS2008 csproj 파일에서 참조 목록을 읽는 방법을 알고 있습니까? MSBuild는이 기능을 지원하지 않습니다. csproj 파일을 XmlDocument로로드하여 노드를 읽으려고하지만 XPath 검색이 노드를 반환하지 않습니다. 나는 그것을 참조 정보를 포함 여부를 결정할 수 ItemGroups의 목록을 얻을 수있는 경우csproj 파일에서 참조 목록 읽기

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

: 나는 다음과 같은 코드를 사용하고 있습니다.

답변

37

XPath는 /Project/ItemGroup/Reference이어야하며 네임 스페이스를 잊어 버린 것입니다. 그냥 XLINQ를 사용합니다 - XPathNavigator의 네임 스페이스를 다루는 것은 다소 지저분합니다. 그래서 : @Pavel Minaev의 대답에

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

훨씬 쉬웠습니다. 도와 주셔서 감사합니다. –

+0

대단하군요! 이제는 모든 사람들이 그 사실을 알아 차렸을 것입니다.하지만 경우에 따라서는 솔루션 내에서 참조를 만들 수도 있습니다. 이런 경우에는'ProjectReference' 요소도 필요합니다. – astrowalker

6

건물이 내가 또한,

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

@ PavelMinaev의 대답을 기반으로합니다 (이 속성을 포함 읽어 추가 .Attributes 선을 확인) 나를 위해 일한 것입니다 출력에 "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);