2014-04-18 1 views
6

를로드 할 수 없습니다. 나는 코드의 처음 몇 줄을지나 점점 그러나 문제가 있습니다 :/로슬린 /은 참조 찾기 - 제대로 나는 오픈 소스 UML 시퀀스 다이어그램 도구를 만들기 위해 찾고으로 주어진 방법의 모든 메소드 호출을 찾기 위해 코드를 작성하기 위해 노력하고있어 작업 공간

API는 크게 변화 한 것으로 나타나고 나는 코드를보고 적절한 사용을 추론 할 수없는 것.

내가 할 경우 :

var workspace = new CustomWorkspace(); 
    string solutionPath = @"C:\Workspace\RoslynTest\RoslynTest.sln"; 
    var solution = workspace.CurrentSolution; 

내가 workspace.CurrentSolution 0 프로젝트를 가지고 찾을 수 있습니다. 나는 이것이 이전에 Workspace.LoadSolution(string solutionFile)이었던 것과 같을 것이라고 생각했다. 그 해결책은 어떤 프로젝트라도 솔루션에 포함시킬 것이지만이 경로로 어떤 성공도 찾지 못할 것이다.

나는 누군가가 내가 특정 방법의 모든 호출을 식별 할 FindReferences API를 사용할 수있는 방법에 대한 몇 가지 추가 지침을 제공 할 수 있다면 0.o

이, 그것은 매우 감사하겠습니다 정말 혼란 스러워요!

는 다른 방법으로, 나는 정적 분석 접근 방식을 가지고 더 나을 것? 나는 람다 (lambdas), 반복자 (iterator) 메소드 및 비동기 (async)와 같은 것을 지원하고 싶다.

============================================== ======================

편집 - 여기

이 허용 대답에 따라 전체 예입니다

using System.Linq; 
using Microsoft.CodeAnalysis.CSharp; 
using Microsoft.CodeAnalysis.CSharp.Syntax; 
using Microsoft.CodeAnalysis.MSBuild; 
using Microsoft.CodeAnalysis.FindSymbols; 
using System.Diagnostics; 

namespace RoslynTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string solutionPath = @"C:\Workspace\RoslynTest\RoslynTest.sln"; 
      var workspace = MSBuildWorkspace.Create(); 
      var solution = workspace.OpenSolutionAsync(solutionPath).Result; 
      var project = solution.Projects.Where(p => p.Name == "RoslynTest").First(); 
      var compilation = project.GetCompilationAsync().Result; 
      var programClass = compilation.GetTypeByMetadataName("RoslynTest.Program"); 

      var barMethod = programClass.GetMembers("Bar").First(); 
      var fooMethod = programClass.GetMembers("Foo").First(); 

      var barResult = SymbolFinder.FindReferencesAsync(barMethod, solution).Result.ToList(); 
      var fooResult = SymbolFinder.FindReferencesAsync(fooMethod, solution).Result.ToList(); 

      Debug.Assert(barResult.First().Locations.Count() == 1); 
      Debug.Assert(fooResult.First().Locations.Count() == 0); 
     } 

     public bool Foo() 
     { 
      return "Bar" == Bar(); 
     } 

     public string Bar() 
     { 
      return "Bar"; 
     } 
    } 
} 
+0

당신의 솔루션을 시도하고 솔루션 -> 작업 공간 -> CanOpenDocuments에서 false로 할당 된이 속성 "CanOpenDocuments"에 비틀 거림 내가 뭘 잘못 했습니까? –

+0

솔루션이 오래되었다는 것을 알고 있습니다. – Jordan

답변

9

CustomWorkspace

프로젝트 및 문서를 수동으로 추가 할 수있는 작업 공간입니다. 당신이 솔루션을로드하려고하고 있기 때문에

, 당신은

은 MSBuild 솔루션 및 프로젝트 파일을 열어 채울 수있는 작업 공간입니다 MSBuildWorkspace를 사용해야합니다.

MSBuildWorkspace을 작성하고 solutionPath으로 OpenSolutionAsync를 호출 할 수 있습니다. 참고 자료 찾기 부분은 SymbolFinder을 참조하십시오.

+0

@DavirdPoeschl 분석기를 실행하는 동안 솔루션의 이름을 모른다면 어떻게 동적으로 가져올 수 있습니까? –

+0

@KevinAvignon 분석기를 사용하는 경우 API에서 제공하는 정보 (분석 할 구문 노드 또는 기호 및 일부 컨텍스트) 만 있으면됩니다. 제공되는 것 이상으로 필요한 것은 무엇입니까? 시나리오가있는 경우 별도의 질문을 만드십시오. –

2

솔루션은 MSBuild 개념입니다.

당신은 MSBuildWorkspace을 만들고 OpenSolutionAsync()를 호출해야합니다.

1
string solutionPath = @"C:\Workspace\RoslynTest\RoslynTest.sln"; 

은 로컬 변수를 만듭니다. 귀하의 CustomWorkspace 개체에는 영향을 미치지 않습니다.

관련 문제