引言

最近做一个功能想要动态执行C#脚本,就是预先写好代码片段,在程序运行时去执行代码段,比如像这样(以下代码为伪代码):

string scriptText = "int a = 1;int b = 2; return a+b ;";

var result = Script.Run(scriptText);
查阅了一些资料,发现 .Net的开源编译器平台 - Roslyn,可以支持这样的功能。

其实 Roslyn 提供了很多强大的功能,比如:

提供了一组丰富的 API,允许开发人员在运行时动态地生成、编译和执行代码。这些 API 分为两类:编译 API 和工作空间 API。编译 API 用于分析和生成代码,工作空间 API 用于与集成开发环境(IDE)进行交互。通过这些 API,开发人员可以构建强大的代码分析和重构工具。
支持对源代码进行静态分析,以便在编译期间检测潜在的代码问题。也支持编写自定义诊断和代码修复,这使得开发人员可以根据自己的需求创建特定的诊断和修复工具。
Roslyn 支持 C# 和 VB.NET 两种编程语言。它提供了一组通用 API,这样两种语言之间共享代码就变得容易。
Roslyn 与 Visual Studio、Visual Studio Code 和其他支持 C# 和 VB.NET 的 IDE 集成很好

Roslyn概述

因为现在需要它的动态编译,动态执行代码的功能,所以先仔细了解一下,看一下它的官方概述(https://github.com/dotnet/roslyn/blob/main/docs/wiki/Roslyn-Overview.md
因为官方概述是英文版,所以我将他翻译为了中文:

概述内容包括:

介绍
公开的编译器API
编译器流水线功能区域(Compiler Pipeline Functional Areas)
API层
编译器 API(Compiler APIs)
诊断 API(Diagnostic APIs)
脚本 API (Scripting APIs)
工作区 API(Workspaces APIs)
使用语法
语法树(Syntax Trees)
语法节点(Syntax Nodes)
语法标记(Syntax Token)
语法琐事(Syntax Trivia)
跨度(Spans)
种类(Kinds)
错误(Error)
使用语义
汇编(Compilation)
符号(Symbols)
语义模型(Semantic Model)
使用工作区
工作区(Workspace)
解决方案,项目和文档(Solutions, Projects and Documents)

介绍

传统上来说,编译器就是黑盒 -- 源代码进入一端,经过一些神奇的过程,然后输出目标文件或者汇编代码。

编译器会对代码进行深入的理解,但这些知识只有编译器实现者才能使用。然而,现在我们越来越多地依赖于集成开发环境(IDE)的功能,如智能提示、重构、智能重命名、查找引用和转到定义等,以提高工作效率。我们还使用代码分析工具来改善代码质量,使用代码生成工具来辅助构建应用程序。

随着这些工具变得越来越智能,它们需要访问编译器所具有的深层代码知识。这就是 Roslyn的核心任务:打开这些黑盒子,让工具和终端用户能够分享编译器对代码的丰富信息。

通过Roslyn,编译器成为一个平台,提供API供工具和应用程序使用,而不仅仅是将源代码翻译为目标代码的工具。这种过渡降低了创建面向代码的工具和应用程序的门槛,为元编程、代码生成和转换、交互式使用C#和VB语言以及将C#和VB嵌入领域特定语言等领域的创新提供了机会。

Roslyn SDK预览版包含了用于代码生成、分析和重构的最新语言对象模型的草案。

我们希望在未来的预览版中包含用于脚本编写和交互使用C#和Visual Basic的API支持的草案。本文提供了Roslyn的概念概述。更多细节可以在SDK预览版中的演练和示例中找到。

公开的编译器API

编译器流水线功能区域(Compiler Pipeline Functional Areas)Roslyn通过提供与传统编译器流水线相对应的API层,将C#和Visual Basic编译器的代码分析暴露给开发者作为使用者。
图片
该流水线的每个阶段现在都是一个单独的组件。首先是解析阶段,源代码被标记化并解析为符合语言语法的语法结构。其次是声明阶段,对源代码和导入的元数据进行分析,形成命名符号。接下来是绑定阶段,将代码中的标识符与符号进行匹配。最后是发出阶段,编译器构建的所有信息作为一个程序集进行输出。
图片
针对每个阶段,都有一个相应的对象模型,允许访问该阶段的信息。解析阶段以语法树的形式暴露,声明阶段以层次化符号表的形式暴露,绑定阶段以显示编译器语义分析结果的模型形式暴露,发出阶段以生成IL字节码的API形式暴露。
图片


至今单身的槟榔
1 声望0 粉丝

下一篇 »
稀疏数组