C# 罗斯林,怎么上所有的课
如何从Roslyn编译中获取所有类C# 罗斯林,怎么上所有的课,c#,compilation,roslyn,C#,Compilation,Roslyn,如何从Roslyn编译中获取所有类 var sln = Path.Combine(path, "xxx.sln"); var workspace = MSBuildWorkspace.Create(); var solution = await workspace.OpenSolutionAsync(sln); Project project = solution.Projects.First(x => x.Name =
var sln = Path.Combine(path, "xxx.sln");
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(sln);
Project project = solution.Projects.First(x => x.Name == "bbb");
var compilation = await project.GetCompilationAsync();
创建一个覆盖VisitNamedType
以处理每个类型(可能不是类)的
然后,将其传递到
compilation.Assembly.Accept()
这就是我访问解决方案中所有类的方式
class ClassVirtualizationVisitor : CSharpSyntaxRewriter
{
List<string> classes = new List<String>();
public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
{
node = (ClassDeclarationSyntax) base.VisitClassDeclaration(node);
string className = node.Identifier.ValueText;
classes.Add(className); // save your visited classes
return node;
}
}
这是我的工作代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;
using System.Threading.Tasks;
namespace Kardex.LC3xx.CreateApiDokumentation
{
//Patch to work with VS2013
// https://support.microsoft.com/en-us/kb/2971005
class Program
{
private static void Main(string[] args)
{
Run(args).Wait();
Console.ReadLine();
}
private async static Task Run(string[] args)
{
var path = Path.GetDirectoryName(typeof (Program).Assembly.Location);
var sln = Path.Combine(path, "xxx.sln");
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(sln);
Project project = solution.Projects.First(x => x.Name == "bbbb");
var compilation = await project.GetCompilationAsync();
foreach (var @class in compilation.GlobalNamespace.GetNamespaceMembers().SelectMany(x=>x.GetMembers()))
{
Console.WriteLine(@class.Name);
Console.WriteLine(@class.ContainingNamespace.Name);
}
var classVisitor = new ClassVirtualizationVisitor();
foreach (var syntaxTree in compilation.SyntaxTrees)
{
classVisitor.Visit(syntaxTree.GetRoot());
}
var classes = classVisitor.Classes;
}
class ClassVirtualizationVisitor : CSharpSyntaxRewriter
{
public ClassVirtualizationVisitor()
{
Classes = new List<ClassDeclarationSyntax>();
}
public List<ClassDeclarationSyntax> Classes { get; set; }
public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
{
node = (ClassDeclarationSyntax)base.VisitClassDeclaration(node);
Classes.Add(node); // save your visited classes
return node;
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用Microsoft.CodeAnalysis;
使用Microsoft.CodeAnalysis.CSharp;
使用Microsoft.CodeAnalysis.CSharp.Syntax;
使用Microsoft.CodeAnalysis.MSBuild;
使用System.Threading.Tasks;
命名空间Kardex.LC3xx.CreateApiDokumentation
{
//使用VS2013的修补程序
// https://support.microsoft.com/en-us/kb/2971005
班级计划
{
私有静态void Main(字符串[]args)
{
运行(args.Wait();
Console.ReadLine();
}
专用异步静态任务运行(字符串[]args)
{
var path=path.GetDirectoryName(typeof(Program).Assembly.Location);
var sln=Path.Combine(路径,“xxx.sln”);
var workspace=MSBuildWorkspace.Create();
var solution=await workspace.OpenSolutionAsync(sln);
Project=solution.Projects.First(x=>x.Name==“bbbb”);
var compilation=await project.GetCompilationAsync();
foreach(编译中的var@class.GlobalNamespace.GetNamespaceMembers().SelectMany(x=>x.GetMembers())
{
Console.WriteLine(@class.Name);
Console.WriteLine(@class.ContainingNamespace.Name);
}
var classVisitor=new ClassVirtualizationVisitor();
foreach(编译中的var syntaxTree.SyntaxTrees)
{
Visit(syntaxTree.GetRoot());
}
var classes=classVisitor.classes;
}
类虚拟化访问者:CSharpSyntaxRewriter
{
公共类虚拟化访问者()
{
类=新列表();
}
公共列表类{get;set;}
公共重写SyntaxNode VisitClassClassDeclaration(ClassDeclarationSyntax节点)
{
node=(ClassDeclarationSyntax)base.VisitClassDeclaration(node);
添加(节点);//保存您访问的类
返回节点;
}
}
}
}
我认为SymbolVisitor
不会“遍历”层次结构,因此用户还必须通过覆盖VisitaAssembly
和VisitNamespace
来遍历层次结构,对吗?
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;
using System.Threading.Tasks;
namespace Kardex.LC3xx.CreateApiDokumentation
{
//Patch to work with VS2013
// https://support.microsoft.com/en-us/kb/2971005
class Program
{
private static void Main(string[] args)
{
Run(args).Wait();
Console.ReadLine();
}
private async static Task Run(string[] args)
{
var path = Path.GetDirectoryName(typeof (Program).Assembly.Location);
var sln = Path.Combine(path, "xxx.sln");
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(sln);
Project project = solution.Projects.First(x => x.Name == "bbbb");
var compilation = await project.GetCompilationAsync();
foreach (var @class in compilation.GlobalNamespace.GetNamespaceMembers().SelectMany(x=>x.GetMembers()))
{
Console.WriteLine(@class.Name);
Console.WriteLine(@class.ContainingNamespace.Name);
}
var classVisitor = new ClassVirtualizationVisitor();
foreach (var syntaxTree in compilation.SyntaxTrees)
{
classVisitor.Visit(syntaxTree.GetRoot());
}
var classes = classVisitor.Classes;
}
class ClassVirtualizationVisitor : CSharpSyntaxRewriter
{
public ClassVirtualizationVisitor()
{
Classes = new List<ClassDeclarationSyntax>();
}
public List<ClassDeclarationSyntax> Classes { get; set; }
public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
{
node = (ClassDeclarationSyntax)base.VisitClassDeclaration(node);
Classes.Add(node); // save your visited classes
return node;
}
}
}
}