2 .netcore Roslyn 动态编译 语法分析

NetCore基于Roslyn的动态编译实现 AvalonEdit文本器+NRefactory+Roslyn动态编译 1. AvalonEdit实现编写,高亮,复制,黏贴,撤回等基础功能 2. NRefactory实现代码提示相关 3. Roslyn实现动态编译(CSharpCodeProvider只支持Framework,Roslyn可以同时支持Framwork和netcore) 阅读详情

原文地址:
https://docs.microsoft.com/zh-cn/dotnet/csharp/roslyn-sdk/get-started/syntax-analysis

安装 .NET Compiler Platform SDK

安装 .NET Compiler Platform SDK 我们可以在Visual Studio查看语法树
执行如下步骤安装 .NET Compiler Platform SDK
运行“Visual Studio 安装程序”
选择“修改”
检查“Visual Studio 扩展开发”工作负荷 。
在摘要树中打开“Visual Studio 扩展开发”节点 。
选中“.NET Compiler Platform SDK”框 。 将在可选组件最下面找到它。

安装包

使用Roslyn前先安装包 Microsoft.CodeAnalysis.CSharp

了解语法树

语法树由生成项目时或开发人员按 F5 时所运行的分析程序生成。
语法树的四个主要构建基块为:
Microsoft.CodeAnalysis.SyntaxTree 类:
代表整个分析树。 SyntaxTree 是一种带有语言特定派生类的抽象类。 使用 Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree类对 C# 的文本进行分析。
Microsoft.CodeAnalysis.SyntaxNode 类:
表示语法节点,如声明、语句、子句和表达式等语法
Microsoft.CodeAnalysis.SyntaxToken 结构:
表示语法标志,它代表独立的关键词、标识符、运算符或标点。
Microsoft.CodeAnalysis.SyntaxTrivia 结构:
它代表语法上不重要的信息,例如标记、预处理指令和注释之间的空格。

在 Visual Studio 中,选择“视图” > “其他窗口” > “语法可视化工具”查看代码语法
SyntaxNode:蓝色 | SyntaxToken:绿色 | SyntaxTrivia:红色

遍历语法节点

        static void Main(string[] args)
        {
            const string programText =
@"using System;
using System.Collections;
using System.Linq;
using System.Text;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(""Hello, World!"");
        }
    }
}";
            SyntaxTree tree = CSharpSyntaxTree.ParseText(programText);
            // 获取根语法节点
            CompilationUnitSyntax root = tree.GetCompilationUnitRoot();

            // 语法的类型,当前为 CompilationUnit 类型
            Console.WriteLine($"The tree is a {root.Kind()} node.");
            // 遍历语法使用的 Using
            foreach (UsingDirectiveSyntax element in root.Usings)
                Console.WriteLine($"\t{element.Name}");

            // 遍历根语法节点的成员,返回子语法节点
            MemberDeclarationSyntax firstMember = root.Members[0];
            // 查看语法节点的类型
            Console.WriteLine($"The first member is a {firstMember.Kind()}.");
            // 其实该子语法节点是个 命名空间语法节点,所以强制转换
            var helloWorldDeclaration = (NamespaceDeclarationSyntax)firstMember;

            // 获取子语法节点
            var programDeclaration = (ClassDeclarationSyntax)helloWorldDeclaration.Members[0];
            // Identifier 是语法标志,包含类的名称
            Console.WriteLine($"{programDeclaration.Identifier} class.");

            // 获取子语法节点
            var mainDeclaration = (MethodDeclarationSyntax)programDeclaration.Members[0];

            // 返回类型
            Console.WriteLine($"The return type is {mainDeclaration.ReturnType}.");
            
            // 遍历参数语法节点
            foreach (ParameterSyntax item in mainDeclaration.ParameterList.Parameters)
                Console.WriteLine($"The type of the {item.Identifier} parameter is {item.Type}.");

            var argsParameter = mainDeclaration.ParameterList.Parameters[0];

            Console.ReadKey();
        }

查询方法

除了遍历树,还可以使用 Microsoft.CodeAnalysis.SyntaxNode 上定义的查询方法来探索语法树

SyntaxTree tree = CSharpSyntaxTree.ParseText(programText);
// 获取根语法节点
CompilationUnitSyntax root = tree.GetCompilationUnitRoot();

// DescendantNodes 为获取所有子语法节点(Descendant:后代)
var firstParameters = from methodDeclaration in root.DescendantNodes()
                                        .OfType<MethodDeclarationSyntax>()
                      where methodDeclaration.Identifier.ValueText == "Main"
                      select methodDeclaration.ParameterList.Parameters.First();

var argsParameter2 = firstParameters.Single();

Console.WriteLine(argsParameter2.ToFullString());

语法查看器(CSharpSyntaxWalker)

查看器接收一个语法节点,并遍历该节点和其子节点
定义查看器

public class UsingCollector : CSharpSyntaxWalker
{
    public ICollection<UsingDirectiveSyntax> Usings { get; } = new List<UsingDirectiveSyntax>();

    public override void VisitUsingDirective(UsingDirectiveSyntax node)
    {
        if (node.Name.ToString() == "System" || node.Name.ToString().StartsWith("System."))
        {
            this.Usings.Add(node);
        }
    }
}

使用查看器遍历语法数

SyntaxTree tree = CSharpSyntaxTree.ParseText(programText);
// 获取根语法节点
CompilationUnitSyntax root = tree.GetCompilationUnitRoot();

var collector = new UsingCollector();
collector.Visit(root);
foreach (var directive in collector.Usings)
{
    Console.WriteLine(directive.Name);
}
SyntaxFactoryVsParseText:比较使用SyntaxFactory和CSharpSyntaxTree.ParseText创建C#SyntaxTree的基准 语法FactoryVsParseText 比较使用SyntaxFactory和CSharpSyntaxTree.ParseText创建C#SyntaxTree的基准 立即下载

相关推荐

【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

什么时候勾选Bake into pose,当不希望动画带动游戏对象旋转时。在旋转的动画中一般是不用勾选的,因为就需要用它来带动我们的角色对象旋转。但在比如前进、后退、待机等动画来说,我们就可以勾选这里,以避免因动画文件本身的瑕疵而给我们带来的旋转。loop match:代表了这个动画在角度上的吻合度。如果这个动画在播放中转角过大,那么就会显示红色,告诉我们如果勾选bake into pose,则会带来不好的效果。

weixin_60154963的博客 6805

.NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量

随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入。如何确保提交代...

dotNET跨平台 414

STM32F103C8T6+TB6612驱动直流电机全攻略(附PWM调速代码)

本文提供了一份基于STM32F103C8T6微控制器和TB6612驱动模块的直流电机驱动完整解决方案。详细解析了硬件连接、STM32CubeMX配置、HAL库驱动代码编写,并附带了PWM调速代码实现。内容涵盖从基础原理到实战调试的全过程,旨在帮助开发者快速构建稳定、可精准调速的电机控制系统,适用于智能车、机器人等嵌入式项目。

weixin_29181861的博客 586

【进阶编程】Roslyn 解析 C# 语法树(Syntax Tree)的节点详解

其中每个代码元素(类、方法、变量等)都是一个。Roslyn 解析 C# 代码后会生成一棵。:表示整个 C# 代码文件的最顶层节点。每个 C# 代码结构都对应一个。(可用于代码分析、代码重写)(如代码风格分析、代码补全)(如自动修正、代码重构)

u013136510的博客 1122

Qt EGLFS 图形后端详解

EGLFS (EGL Full Screen) 是Qt框架在嵌入式Linux系统中的高性能图形显示后端,它提供了直接基于EGL和OpenGL ES的硬件加速渲染解决方案。

浩瀚之水的专栏 513

保研考研机试攻略:python笔记(4)

保研考研机试攻略:python笔记(4)二分法+最大公约数+最小公倍数+素数判断+幂次方mod方法+匹配问题+哈希算法+哈夫曼编码+二叉树

qq_63349644的博客 1097

C#使用SyntaxTree获取.cs文件中的属性名和注释

C#解析代码树,获取属性及其注释

一只不知疲倦的学习猿 990

Qt c++ llama.cpp 运行 LLaMA-3-8B 中文对话机器人(多模态输入)

助手:

寒寒豆豆软件公司的博客 221

【亲测免费】 AvalonEdit文本器+NRefactory代码提示+Roslyn动态编译

AvalonEdit文本器+NRefactory代码提示+Roslyn动态编译 【下载地址】AvalonEdit文本器NRefactory代码提示Roslyn动态编译 AvalonEdit文本器+NRefactory代码提示+Roslyn动态编译本仓库提供了一个资源文件,包含了AvalonEdit文本器、NRefacto...

gitblog_09800的博客 559

µC/OS-II---任务就绪表

意思是:将变量OSRdyGrp中最低位为1的位数赋给y,那么,y就是最高优先级任务所在就绪表的行号,那么最高优先级的任务就在OSRdyGrp[y]行中,再根据。

weixin_45880844的博客 1649

YOLOv11改进 | 网络结构代码逐行解析(二) | yolov11中的Mosaic增强详解

本文给大家带来的是YOLOv10中的Mosaic增强代码的详解,可能有部分人对于这一部分比较陌生,有的读者可能知道Mosaic增强但是不知道其工作原理,具体来说Mosaic增强就是指我们的数据集中的图片在输入给模型之前的一个处理过程(我们的图片并不是直接就输入给模型了,大家的训练结果中的结果检测图片大家可以看到数据集中多个图片会组合在一起这就是简单的Mosaic增强),下面我就来讲解一下其在YOLOv10中工作原理和代码定义,下面图片为一个Mosaic增强后的图片。​。

Snu77的博客 5022

C#实现在程序中动态编译一段C#代码并执行

C# 可以通过或 CSharpCodeProvider实现动态编译并执行 C# 代码。以下是两种方法的详细介绍和示例代码。

yuanpan的专栏 1737

080、多轴运动控制:插补器设计(螺旋线插补)

本文分享了螺旋线插补器设计的实战经验。针对五轴点胶机Z轴抖动问题,作者分析了螺旋线数学本质,提出基于归一化时间参数的速度规划方法,强调各轴严格同步的重要性。文章详细介绍了速度分解、加减速处理、嵌入式优化技巧(查表法、定点化),并总结了起点闭合、速度波动、数值处理等常见问题解决方案。最后给出5条实用建议:注重速度规划而非纯数学推导、预先仿真、保留调试接口、考虑机械谐振、防范编码器丢脉冲。通过优化插补周期、电子齿轮比和S形速度曲线,成功将设备良率从60%提升至95%。

m0_50546716的博客 86

5 .netcore Roslyn 动态编译 编译

使用CSharpCompilation实现动态编译 // 添加要引用的程序集 List<MetadataReference> refs = new List<MetadataReference>() { MetadataReference.CreateFromFile (typeof (object).Assembly.Location), MetadataReference.CreateFromFile (typeof (List<int>).Assem

dabusidede的博客 1718

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

基于 Roslyn 实现动态编译

基于 Roslyn 实现动态编译Intro之前做的一个数据库小工具可以支持根据 Model 代码文件生成创建表的 sql 语句,原来是基于 CodeDom 实现的,最近改...

dotNET跨平台 1714

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用 Roslyn引擎动态编译代码

Roslyn引擎自2014年开源至今这么久,一直没怎么了解过,虽然VS2015早就集成了它。 以前老一套的动态编译方法在 .NET Core中似乎不再支持了,很多方法都是未实现的。下面就介绍如何在.NET Core环境中使用Roslyn进行动态编译。话不多说,Talk is cheap, show me the code. 首先是安装nuget包 Install-Package Micr...

weixin_34082789的博客 917

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

.net Core 3.1下的Roslyn 动态编译

CSharpCodeProvider说是支持.net core 经过实验是不支持的,所以动态编译选择roslyn。 首先,我们需要建立一个项目 .net core ,nuget 安装Microsoft.CodeAnalysis.CSharp和Microsoft.CodeAnalysis.CSharp.Workspaces. 哪我就直接上代码 就不多说 说一些遇到问题点 public static bool BuildAssembly(string TenancyFID, str...

Crazy2910的专栏 2510

3 .netcore Roslyn 动态编译 语义分析

原文地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/roslyn-sdk/get-started/semantic-analysis 什么是语义 语法规定了代码怎么写,而语义规定了代码表达了什么意思 了解编译和符号 Compilation 实例是编译器所看见的单个项目 符号是一个名词(如命名空间System,类Console等),其包含了描述该名词的信息(如:类型、命名空间、成员和变量的实体) Compilation 允许你查找“符号” 通过Microso

dabusidede的博客 658

1 .netcore Roslyn 动态编译 概念

语法树 语法树是用于编译、代码分析、绑定、重构、IDE 功能和代码生成的主要结构。 语法树具有三个关键特性。 1.是语法树完全保真地保留所有源代码信息,即通过语法树可以看到原来的代码 2.编辑语法树会创建新的树,而不会更改现有树,通过这些操作,可高效编辑文本。 3.获取的树是代码当前状态的快照,不会更改。 这可让多个用户同时在不同线程中与同一语法树进行交互,而不会锁定或重复 语法树实际上是一个树形数据结构,其中非终端结构化元素是其他元素的父元素。 语法节点 语法树由语法节点组成。如声明、语句、子句和表达式等

dabusidede的博客 772

4 .netcore Roslyn 动态编译 语法替换

简单的语法替换 该示例将using System.Collections.Generic替换为using System static void Main(string[] args) { const string programText = @" using System.Collections.Generic; using System.Text; namespace HelloWorld { class Program {

dabusidede的博客 452

netcore 动态编译代码生成dll 带工程 多文件

Microsoft.CodeAnalysis.CSharp netcore 动态生成

pehao的博客 622

.net core ——利用 roslyn 编译C#代码

目录 Rosyln介绍 实时编译c#文本为dll 1、增加PreserveCompilationContext配置 2、引用包 3、利用DependencyContext获取编译引用dll 完整例子 引用test库 总结 注脚 Rosyln介绍 Rosyln1是 .NET Core和 .NET 4.6+ 中 的C# 、VB的编译器,宇宙最强IDE Visual Studio 也是使用其来编译代码的, 基于编译器也是服务的理念,微软开发者把其独立出来,并开源维护,开源地址参见...

寒冰屋的专栏 2642
上一篇: 1 .netcore Roslyn 动态编译 概念
下一篇: 3 .netcore Roslyn 动态编译 语义分析
dabusidede
博客等级 码龄9年 84粉丝 208原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值