Я новичок в roslyn, поэтому я попытался начать его изучение с создания очень простого консольного приложения, которое представлено на известном учебном сайте.(https://riptutorial.com/roslyn/example/16545/introspective-analysis-of-an-analyzer-in-csharp), и он не работал должным образом.
Созданное мною приложение Cosole предназначено для .NET Framework (целевая версия Framework 4.7.2), а не для .NET Core или .NETстандарт. Я добавил пакет NuGet Microsoft.CodeAnalysis и Microsoft.CodeAnalysis.Workspaces.MSBuild, а затем написал простой код, как показано ниже.
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;
using System;
using System.Linq;
namespace SimpleRoslynConsole
{
class Program
{
static void Main(string[] args)
{
// Declaring a variable with the current project file path.
// *** You have to change this path to fit your development environment.
const string projectPath =
@"C:\Users\[MyName]\Source\Repos\RoslynTrialConsole01\RoslynTrialConsole01.csproj";
var workspace = MSBuildWorkspace.Create();
var project = workspace.OpenProjectAsync(projectPath).Result;
// [**1]Getting the compilation.
var compilation = project.GetCompilationAsync().Result;
// [**2]As this is a simple single file program, the first syntax tree will be the current file.
var syntaxTree = compilation.SyntaxTrees.FirstOrDefault();
if (syntaxTree != null)
{
var rootSyntaxNode = syntaxTree.GetRootAsync().Result;
var firstLocalVariablesDeclaration = rootSyntaxNode.DescendantNodesAndSelf()
.OfType<LocalDeclarationStatementSyntax>().First();
var firstVariable = firstLocalVariablesDeclaration.Declaration.Variables.First();
var variableInitializer = firstVariable.Initializer.Value.GetFirstToken().ValueText;
Console.WriteLine(variableInitializer);
}
else
{
Console.WriteLine("Could not get SyntaxTrees from this projects.");
}
Console.WriteLine("Hit any key.");
Console.ReadKey();
}
}
}
Моя проблема заключается в том, что свойство SyntaxTrees объекта Compilation возвращаетNULL в значке [** 2]. Естественно, следующий метод FirstOrDefault возвращает значение NULL.
Я пробовал несколько других кодов. Я обнаружил, что могу получить SyntaxTree из текста кода CSharp, используя метод CSharpSyntaxTree.ParseText. НоЯ не смог получить ничего из исходного кода, по последовательности
var workspace = MSBuildWorkspace.Create();
var project = workspace.OpenProjectAsync(projectPath).Result;
var compilation = project.GetCompilationAsync().Result;
Что я хотел бы знать, так это то, что я что-то упускаю, чтобы получить информацию о синтаксисе из исходного кода, используя описанный выше процесс.
Я буду признателен, если кто-нибудь даст мне хороший совет.