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的基准 立即下载

相关推荐

使用STM输出互补SPWM波(三相各差120°)

使用STM32输出SPWM波形(三相各差120°)

hello011102的博客 7373

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

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

dotNET跨平台 414

ZYNQ开发(2)在Linux系统层上PL-PS通过AXI-DMA传输数据详细步骤及注意事项

参考的网络资料 https://github.com/bperez77/xilinx_axidma/tree/master https://gitlab.gnome.org/HosseinBeheshti/UlteraZed7EV/-/tree/master/petalinux/xilinx_axidma https://www.icode9.com/content-3-925319.html https://blog.csdn.net/weixin_38218267/article/details/1

aizaiyueye的专栏 3448

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

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

u013136510的博客 1122

基于级联H桥的储能变流器仿真与性能优化

本文深入探讨了基于级联H桥的储能变流器,通过仿真建模与性能优化,详细解析了其模块化结构、载波移相SPWM控制策略及核心性能指标。重点攻克了电池SOC均衡难题,介绍了利用零序电压注入实现相内均衡及功率调节实现相间均衡的实战策略,为提升储能系统效率与电池寿命提供了关键技术路径。

gpu4optimizer的博客 371

交货单冲销发货过账的正确姿势:用 VL09 与 ABAP 批量反冲 Goods Issue

摘要 本文详细解析了SAP系统中VL09事务码的技术实现与业务应用。VL09用于反冲发货的货物移动,通过标准冲销路径(移动类型602冲销601)确保单据链路一致、状态机正确回退和业务规则生效。文章对比了经典VL09与Fiori应用在不同SAP产品形态中的位置,并针对STO场景提供了ME23N验证方法。核心内容包括WS_REVERSE_GOODS_ISSUE函数模块的调用要点、必须COMMIT的原因(SAP LUW机制),以及处理Handling Unit等限制条件的注意事项。最后给出了将VL09工程化的项目

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 592

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

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

一只不知疲倦的学习猿 990

Prism 入门02,区域介绍

什么是区域(Region)?区域,在Prism 框架中,区域是模块化的核心的功能之一,其主要作用是降低应用程序和模块之间的耦合度。使用方式:在应用程序的界面中,划分出某块区域,并为这个区域定义一个唯一的区域名称。那么通过这个区域名称,应用程序就可以找到指定的区域。并为这个区域动态放置一些容器或控件,从而呈现在界面中。

build2024 1126

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

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

gitblog_09800的博客 559

SAP Group Reporting入门指南(8)--业务操作

关于资产负债表类的匹配,系统预设了SGR01和SGR02两个方法,主要区别在于数据的来源范围,SGR01取自ACDOCA和ACDOCU,如果是0F类型的就会直接显示日记账分录(期间是000的除外,这类凭证是年结结转的,系统不再跨年追溯),如果是其他类型就显示合并分录。这里是我觉得SAP还需要优化的地方。基于ICMR的抵消任务中通常将抵销差异细分为交易差异、货币换算差异和其他差异,这在基于重分类抵消任务是无法实现的,基于重分类抵消只知道一个差异总额,很难从合并抵消凭证看出差异的来源,也没有审计线索可言。

bflyfish的博客 276

手把手教你学AutoSAR - 总目录

鉴于近期较多博友问及微信群,如下可申请好友验证,请备注“autosar”,否则可能添加不通过。验证通过后,拉入讨论群。PS:本人鉴于工作事项可能不能及时回复问题,可在交流群内部和其他博友之间相互沟通交流经验。欢迎来到桃源乐游的《AutoSAR配置与实践》,以下为学习大纲,蓝色字体点击可跳转。

nihaoljq2010的博客 7461

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

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

yuanpan的专栏 1737

93.华为路由器:IPSec加密GRE通道(GRE over IPsec)

IPSec加密GRE通道 由于GRE隧道不提供安全性保障,使用ipsec加密gre隧道是现网中比较常用的VPN部署,它的加密方式分为两种: 可以使用IPsec来加密隧道进行传输,叫做IPsec over GRE; 加密数据流后从隧道传输,称为GRE over IPsec。 下面将配置一个简单的IPsec over GRE实验。 一、搭建模拟环境 首先我们先搭建环境,先根据拓扑图把基本的IP地址配好,然后分别在AR1、AR3加两条静态路由,使得两个公网互通。 [AR1]in g0/0/0 [AR

迷逝 1万+

5 .netcore Roslyn 动态编译 编译

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

dabusidede的博客 1718

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于 Roslyn 实现动态编译

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

dotNET跨平台 1714

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

使用 Roslyn引擎动态编译代码

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

weixin_34082789的博客 917

IEM模型,地表粗糙度模拟

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

.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、付费专栏及课程。

余额充值