2014-04-18 18 views
6
nicht korrekt laden

Ich versuche, Code zu schreiben, um alle Methodenaufrufe einer bestimmten Methode zu finden, wie ich ein Open-Source-UML-Sequenzdiagramm-Tool erstellen möchte. Ich habe jedoch Probleme, die ersten paar Codezeilen zu umgehen:/Roslyn/Finden Sie Referenzen - Kann Workspace

Die API scheint sich drastisch geändert zu haben, und ich kann nicht den korrekten Gebrauch durch einen Blick auf den Code abzuleiten scheinen.

Wenn ich tun:

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

Ich finde, dass workspace.CurrentSolution 0 Projekte hat. Ich dachte, das wäre das Äquivalent zu dem, was vorher Workspace.LoadSolution(string solutionFile) war, das dann angeblich irgendwelche Projekte in der Lösung enthalten würde, aber ich finde keinen Erfolg mit diesem Pfad.

Ich bin furchtbar verwirrt 0.o

Wenn jemand einige zusätzliche Anleitung, wie bieten konnte ich die FindReferences API alle Anrufungen eines bestimmten Verfahrens identifizieren können, wäre es sehr geschätzt werden!

Oder wäre es besser, einen statischen Analyseansatz zu wählen? Ich möchte Dinge wie Lambdas, Iterator-Methoden und Async unterstützen.

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

Bearbeiten -

Hier ist ein vollständiges Beispiel auf der akzeptierte Antwort basiert:

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

Ich habe versucht, Ihre Lösung und ich stolpere über diese Eigenschaft "CanOpenDocuments" bei false zugewiesen, wenn in Solution-> Workspace-> CanOpenDocuments Was habe ich falsch gemacht? –

+0

Lösung könnte veraltet sein - Fühlen Sie sich frei, den Thread zu aktualisieren – Jordan

Antwort

9

CustomWorkspace ist

Ein Arbeitsbereich, die manuelle Zugabe von Projekten und Dokumenten ermöglicht.

Da Sie eine Lösung zu laden sind versuchen, sollten Sie die MSBuildWorkspace verwenden, die

ist

Ein Arbeitsbereich, der durch das Öffnen MSBuild Lösung und Projektdateien aufgefüllt werden kann.

Sie können einen neuen MSBuildWorkspace erstellen und OpenSolutionAsync mit Ihrem solutionPath nennen. Für den Referenzteil schauen Sie sich die SymbolFinder an.

+0

@DavirdPoeschl Wenn ich nicht den Namen der Lösung während der Ausführung meines Analysators weiß, wie kann ich dynamisch abrufen? –

+0

@KevinAvignon Wenn Sie in einem Analysator sind, sollten Sie nur die Informationen benötigen, die von der API bereitgestellt werden (der Syntaxknoten oder das zu analysierende Symbol und ein bestimmter Kontext). Was brauchen Sie über das hinaus? Wenn Sie ein Szenario haben, sollten Sie eine separate Frage erstellen. –

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

erstellt eine lokale Variable. Es hat keinen Einfluss auf Ihr Objekt CustomWorkspace.