架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 331|回复: 1

[资料] .NET/C# 之 Roslyn 编译器平台

[复制链接]
发表于 2024-3-10 10:58:32 | 显示全部楼层 |阅读模式
编译器:编译器是一种程序,它将某种编程语言编写的源代码(原始语言)转换成另一种编程语言(目标语言)。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。

在 .NET 平台中,在执行模型的不同阶段有两个不同的编译器:一个叫 Roslyn 编译器,负责把 C# 和 VB 代码编译为程序集;另一个叫 RyuJIT 编译器,负责把程序集中的 IL(中间语言) 代码编译为机器码。

本文先介绍 Roslyn 编译器。我们不必深入研究它的工作原理,但要了解它的工作机制,要知道它可以用来做什么事情。

最初 C# 语言的编译器是用 C++ 编写的,后来微软推出了一个新的用 C# 自身编写的编译器:Roslyn,它属于自举编译器。

所谓自举编译器就是指,某种编程语言的编译器就是用该语言自身来编写的。自举编译器的每个版本都是用该版本之前的版本来编译的,但它的第一个版本必须由其它语言编写的编译器来编译,比如 Roslyn 的第一个版本是由 C++ 编写的编译器来编译的。很多编程语言发展成熟后都会用该语言本身来编写自己的编译器,比如 C# 和 Go 语言。

在 .NET 平台,Roslyn 编译器负责将 C# 和 VB 代码编译为程序集。

大多数现有的传统编译器都是“黑盒”模式,它们将源代码转换成可执行文件或库文件,中间发生了什么我们无法知道。与之不同的是,Roslyn 允许你通过 API 访问代码编译过程中的每个阶段。

它的工作机制是管道式的,整个工作管道包含四个阶段,每个阶段都是一个独立的模块,每个模块都提供了相应的 API。集成开发环境(IDE)可以利用这些 API 提供方便的工具以提高开发效率,如代码高亮、智能提示、重构工具、性能分析工具等。此外,通过 Roslyn,开发者可以在自己的程序中使用编译器,将编译器作为一种服务来使用。

利用 Roslyn 提供的 API 来动态生成代码示例

首先,新建一个 ClassLibraryGenerator 类库,创建一个以 netstandard2.0 目标框架名字对象 (TFM) 为目标的 .NET 标准库项目。 添加 NuGet 包 Microsoft.CodeAnalysis.Analyzers 和 Microsoft.CodeAnalysis.CSharp,csproj 配置如下:


创建一个名为 TestSourceGenerator.cs 的新 C# 文件,该文件指定你自己的源生成器,如下所示:

从 context 对象中,我们可以访问编译的入口点或 Main 方法。 mainMethod 实例是一个 IMethodSymbol,它表示一个方法或类似方法的符号(包括构造函数、析构函数、运算符或属性/事件访问器)。 Microsoft.CodeAnalysis.Compilation.GetEntryPoint 方法返回程序的入口点的 IMethodSymbol。 其他方法使你可以查找项目中的任何方法符号。 在此对象中,我们可以推理包含的命名空间(如果存在)和类型。 此示例中的 source 是一个内插字符串,它对要生成的源代码进行模板化,其中内插的缺口填充了包含的命名空间和类型信息。 使用提示名称将 source 添加到 context。 对于此示例,生成器创建一个新的生成的源文件,其中包含控制台应用程序中 partial 方法的实现。 可以编写源生成器来添加任何喜欢的源。

新建 ConsoleApp4 控制台应用(不使用顶级语句),代码如下:

同时,添加 ClassLibraryGenerator 项目引用,如下:

尝试启动控制台应用,输出如下:

QQ截图20240310100432.jpg

在 Visual Studio 中,点击项目“依赖项”->“分析器”->“ClassLibraryGenerator”->“ClassLibraryGenerator.TestSourceGenerator”,双击“Program.g.cs”文件,可以看到生成的代码,如下:

QQ截图20240310105630.jpg

提示:修改生成器的代码,可能需要重启 Visual Studio 才能看到

Roslyn GitHub 地址:https://github.com/dotnet/roslyn

参考:

https://learn.microsoft.com/zh-cn/dotnet/csharp/roslyn-sdk/compiler-api-model
https://learn.microsoft.com/zh-cn/dotnet/csharp/roslyn-sdk/source-generators-overview
https://andrewlock.net/creating-a-source-generator-part-5-finding-a-type-declarations-namespace-and-type-hierarchy/




上一篇:Visual Studio 中 C# 交互窗口(Interactive)执行代码
下一篇:Windows 11 原版 ISO 镜像文件下载
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-3-10 10:59:12 | 显示全部楼层
.NET 中 JIT 和 AOT 编译介绍和区别
https://www.itsvse.com/thread-10734-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-27 18:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表