了解 .NET Compiler Platform SDK 模型

编译器按照结构化规则处理代码,这些规则通常不同于用户读取和理解代码的方式。 基本了解编译器使用的模型对于了解生成基于 Roslyn 的工具时使用的 API 至关重要。

编译器管道功能区域

.NET Compiler Platform SDK 通过提供镜像传统编译器管道的 API 层,作为使用者向用户公开 C# 和 Visual Basic 编译器的代码分析。

steps of the compiler pipeline processing source code to object code

此管道的每个阶段都是一个单独的组件。 首先,分析阶段标记化源文本,并将其分析为遵循语言语法的语法。 随后,声明阶段分析源和导入的元数据,形成命名符号。 然后,绑定阶段将代码中的标识符与符号匹配。 最后,发出阶段发出所有信息均由编译器生成的程序集。

compiler pipeline api provides access to each step that is part of the compiler pipeline

.NET Compiler Platform SDK 对应于每个阶段提供一个对象模型,该模型允许访问该阶段的信息。 分析阶段公开一个语法树,声明阶段公开一个分层符号表,绑定阶段公开编译器语义分析的结果,发出阶段公开生成 IL 字节代码的 API。

the language services available from the compiler api at each step of the compiler pipeline

每个编译器将这些组件合并在一起,组成一个端到端整体。

这些 API 与 Visual Studio 使用的 API 相同。 例如,代码大纲和格式设置功能使用语法树,对象浏览器和导航功能使用符号表,重构和转到定义使用语义模型,编辑并继续使用所有这些信息,包括发出 API 。

API 层

.NET 编译器 SDK 包含多个 API 层:编译器 API、诊断 API、脚本 API 和工作区 API。

编译器 API

编译器层包含的对象模型(语法模型和语义模型)对应于在编译器管道的每个阶段公开的信息。 编译器层还包含编译器的单次调用的不可变快照,包括程序集引用、编译器选项和源代码文件。 C# 语言和 Visual Basic 语言由两个不同的 API 表示。 这两个 API 的形状类似,但针对每种语言的高保真进行了定制。 此层不包含 Visual Studio 组件的依赖项。

诊断 API

在编译器分析过程中,编译器会生成一组诊断,包括语法、语义、明确赋值以及各种警告和信息性诊断的所有内容。 编译器 API 层通过一个可扩展 API 公开诊断,该可扩展 API 允许将用户定义的分析器插入编译过程。 它支持随编译器定义的诊断一起生成用户定义的诊断,例如由 StyleCop 等工具生成的诊断。 以这种方式生成诊断有以下优势:与 MSBuild 和 Visual Studio 等工具(具体取决于对根据策略停止生成等体验进行的诊断)自然地集成、在编辑器中显示实时波形曲线,以及建议代码修复。

脚本 API

托管 API 和脚本 API 构建在编译器层之上。 可以使用脚本 API 运行代码片段并累积运行时执行上下文。 C# 交互式 REPL (读取–求值–打印循环)可使用这些 API。 借助 REPL,可将 C# 用作脚本语言,在编写代码的同时,以交互方式运行代码。

工作区 API

工作区层包含工作区 API,是对整个解决方案执行代码分析和重构的起点。 它协助你将解决方案中项目的全部相关信息整理到单个对象模型中,可便于你直接访问编译器层对象模型,而无需分析文件、配置选项或管理项目到项目依赖关系。

此外,工作区层还包含一组 API,用于实现在 Visual Studio IDE 等主机环境中使用的代码分析和重构工具。 相关示例包括查找所有引用、格式设置和代码生成 API。

此层不包含 Visual Studio 组件的依赖项。