了解 .NET 编译器平台 SDK 模型

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

编译器管道功能区域

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

编译器管道将源代码处理到对象代码的步骤

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

编译器管道 API 提供对编译器管道中每个步骤的访问权限

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

编译器管道的每个步骤中编译器 API 提供的语言服务

每个编译器将这些组件合并为单个端到端整体。

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

API 层

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

编译器 API

编译器层包含与编译器管道的每个阶段公开的信息对应的对象模型,包括语法和语义。 编译器层还包含编译器的单个调用的不可变快照,包括程序集引用、编译器选项和源代码文件。 有两个不同的 API 表示 C# 语言和 Visual Basic 语言。 这两个 API 在功能上相似,但都为每种语言量身定制以实现高保真。 此层不依赖于 Visual Studio 组件。

诊断接口

作为分析的一部分,编译器可能会生成一组诊断,涵盖从语法、语义和明确分配错误到各种警告和信息性诊断的所有内容。 编译器 API 层通过可扩展 API 公开诊断,该 API 允许将用户定义的分析器插入编译过程。 它允许用户定义的诊断(如 StyleCop 等工具生成的诊断)与编译器定义的诊断一起生成。 以这种方式生成诊断的好处是可以自然地与 MSBuild 和 Visual Studio 等工具集成,这些工具依赖于诊断来实现一些功能,如根据策略中止生成、在编辑器中显示实时波形曲线以及建议代码修复。

编写 API 脚本

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

工作区 API

工作区层包含工作区 API,这是在整个解决方案上执行代码分析和重构的起点。 它可帮助你将解决方案中项目的所有信息组织到单个对象模型中,从而直接访问编译器层对象模型,而无需分析文件、配置选项或管理项目到项目的依赖项。

此外,工作区层会显示一组 API,用于实现代码分析和重构工具,这些工具在主机环境(如 Visual Studio IDE)中运行。 示例包括查找所有引用、格式设置和代码生成 API。

此层不依赖于 Visual Studio 组件。