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";
}
}
}
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? –
Lösung könnte veraltet sein - Fühlen Sie sich frei, den Thread zu aktualisieren – Jordan