首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.Net 编译器平台--- Roslyn Scripting APIs

引言 上一篇中.Net 编译器平台 --- Roslyn,介绍了Roslyn的各项功能,包括公开API,使用语法,使用语义,使用工作区等功能。...脚本 API 无法在通用 Windows 应用程序和 .NET Native 中使用,因为应用程序模型不支持在运行时加载生成代码。...强类型)(Evaluate a C# expression(strongly-typed)) 带错误处理的评估C#表达式(Evaluated a C# expression with error handling...) 添加引用(Add references) 添加命名空间和类型导入(Add namespace and type imports) 为脚本参数化(Parameterize a script) 创建和构建一个...) object result = await CSharpScript.EvaluateAsync("1 + 2"); 评估一个C#表达式(强类型)(Evaluate a C# expression

18910

.Net 编译器平台 --- Roslyn

其实 「Roslyn」 提供了很多强大的功能,比如: 提供了一组丰富的 API,允许开发人员在运行时动态地生成、编译和执行代码。这些 API 分为两类:编译 API 和工作空间 API。...这种过渡降低了创建面向代码的工具和应用程序的门槛,为元编程、代码生成和转换、交互式使用C#和VB语言以及将C#和VB嵌入领域特定语言等领域的创新提供了机会。...可以让工具(重构工具和集成开发环境)以自然的方式创建、修改和重新排列源代码,而无需直接进行文本编辑。通过创建和操作语法树,工具可以轻松地创建和重新排列源代码。...错误(Error) 即使源代码包含语法错误,也会生成一个完整的语法树,可以循环转换回源代码。当解析器遇到不符合语言定义语法的代码时,它会使用两种技术之一来创建语法树。...您可以使用它来发现以下内容: 源代码中特定位置引用的符号。 任何表达式的结果类型。 所有诊断信息,包括错误和警告。 变量在源代码区域中的流动情况。 更加推测性问题的答案。

24030
您找到你想要的搜索结果了吗?
是的
没有找到

Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码

我曾经在 生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型 一文中提到过这样的想法,在这篇文章中,我希望只编写泛型的一个参数的版本 Demo,然后自动生成 2~16 个参数的版本...于是,我想到可以使用 Roslyn。在项目中编写一段转换代码,我们使用通用的方式去编译和执行这段代码,以便完成各种各样日益增加的类型转换需求。...所以(利好消息),我们这回可以使用 .NET Core 跨平台版本的 Roslyn 了。所以为了充分有跨平台特性,我们创建控制台应用 (.NET Core)。 ?...准备一份用于编译和执行代码文件 我直接使用 生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型 这篇文章中的例子。把其中最关键的文件拿来用于编译和生成试验。...既然得到了类型,那么执行这份代码其实毫无压力,因为我们都懂得反射(好吧,我假装你懂反射)。

1.3K10

C#3.0新增功能10 表达式树 02 说明

表达式树是定义代码的数据结构。 它们基于编译器用于分析代码生成已编译输出的相同结构。表达式树和 Roslyn API 中用于生成分析器和 CodeFixes 的类型之间存在很多相似之处。...但是,表达式树基于一组与 Roslyn API 完全不同的类和 API。 让我们来举一个简单的示例。...父节点将具有对其子节点的引用,且每个节点均具有一个用于介绍节点类型的属性。 表达式树的结构非常一致。 了解基础知识后,你甚至可以理解以表达式树形式表示的最复杂的代码。...优美的数据结构说明了 C# 编译器如何分析最复杂的 C# 程序并从该复杂的源代码创建正确的输出。 熟悉表达式树的结构后,你会发现通过快速获得的知识,你可处理许多越来越高级的方案。...通过表达式树的 API,可创建表示几乎任何有效代码构造的树。 但是,出于尽可能简化的考虑,不能在表达式树中创建某些 C# 习惯用语。

70120

.NET 7 RC 2 发布,倒计时一个月发布正式版

System.Text.Json 源代码生成 回退到 重新启用反射”(关于有关的重大更改)和“帮助您以正确的方式使用 新分析器的API ”等主题。...宣布推出 .NET 7 预览版 2:.NET 7 的第二个预览版包括对正则表达式生成器的增强、将 NativeAOT 从实验状态转换为运行时的进度,以及对“dotnet 新”CLI 体验的一组重大改进...宣布推出 .NET 7 预览版 3:.NET 7 的第三个预览版包括对可观测性、启动时间、代码生成、GC 区域、NativeAOT 编译等的增强功能。...预览版 5:.NET 7 的第五个预览版包括对通用数学的改进,使得构建 API 作者们的生活更轻松,一个新的文本分类 API 用于 ML.NET,它添加了用于自然语言处理的最先进的深度学习技术,对源代码生成器的各种改进...宣布推出 .NET 7 预览版 7:.NET 7 的第七个预览版包括对 System.LINQ、Unix 文件权限、低级结构、p/调用源代码生成代码生成和网页密码的改进。

57320

MSBuildRoslyn 和 NuGet 的 100 个坑

更新于 2018-09-04 13:08 MSBuild 不愧是强大的编译器,它提供的扩展机制让你几乎可以编译任何类型的文件或项目;Roslyn 是全新编写的一套编译器,不过它保留了...---- 系列博客 这是兄弟篇中的一篇,关于 MSBuild/Roslyn 和 NuGet 的 100 个坑: MSBuild/Roslyn 和 NuGet 的 100 个坑 由于这篇博客是大量坑的记录...将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj 一文讲述了如何为项目文件添加 Sdk 属性,以便项目能够体验到最新的 Microsoft.NET.Sdk...但是,只有使用了 Microsoft.NET.Sdk 的新 csproj 文件才会在执行了此命令后重新生成正确的包引用缓存文件;原来的格式并不会生成此文件,也就是说,无法修复。...Import 包中编译相关文件的代码

1.3K20

C# 9.0新特性介绍

遗憾的是,C# 强制编写大量额外的代码创建不可变的引用类型。Record为不可变的引用类型提供类型声明,该引用类型使用值语义实现相等性。...在 C# 9.0 中,已知创建对象的类型时,可在 new 表达式中省略该类型。...7、支持代码生成器 最后两项功能支持 C# 代码生成器。 C# 代码生成器是可编写的组件,类似于 roslyn 分析器或代码修补程序。...区别在于,代码生成器会在编译过程中分析代码并编写新的源代码文件。 典型的代码生成器会在代码中搜索属性或其他约定。 代码生成器使用 Roslyn 分析 API 读取属性或其他代码元素。...通过该信息,它将新代码添加到编译中。 源生成器只能添加代码,不能修改编译中的任何现有代码。 为代码生成器添加的两项功能是分部方法语法和模块初始化表达式的扩展。 首先是对分部方法的更改。

2K20

官宣 .NET 7 Preview 2

引入新的正则表达式生成器 https://github.com/dotnet/runtime/issues/44676 您是否曾经希望拥有针对您的特定模式优化的专用正则表达式引擎所带来的所有巨大好处,...我们很高兴地宣布包含在预览版 1 中的新正则表达式生成器。它带来了我们编译引擎的所有性能优势,而无需启动成本,并且它具有其他优势,例如提供出色的调试体验以及修剪-友好的。...如果您的模式在编译时是已知的,那么新的正则表达式生成器就是要走的路。...为了开始使用它,您只需要将包含类型转换为部分类型,并使用RegexGenerator属性声明一个新的部分方法,该方法将返回优化的Regex对象,就是这样!...源代码生成器将为您填充该方法的实现,并在您更改模式或传入的其他选项时自动更新。

83820

IIncrementalGenerator 增量 Source Generator 生成代码入门 判断程序集之间的 InternalsVisibleTo 关系

当获取到两个程序集时,如果要开始准备生成相关代码,可能会因为不知道两个程序集之间是否存在 InternalsVisibleTo 关系,也就是是否应该导出其 internal 的类型而困扰。...在能够获取到 IAssemblySymbol 类型的对象,即可通过 GivesAccessTo 方法判断两个程序集的 InternalsVisibleTo 关系 这个 GivesAccessTo 方法可以获取到当前的程序集对给定的程序集参数是否为...internal 可见 以下是详细的例子代码 本文的例子的任务是编写一个 Roslyn 分析器,在分析器里面使用 IIncrementalGenerator 增量 Source Generator 生成代码...,获取到对当前正在分析的项目设置 InternalsVisibleTo 的引用程序集,将程序集名作为生成代码的部分,让正在被分析的项目可以编写代码输出有哪些程序集是 internal 可见的 先新建以下...,即可在 Roslyn 分析器里面,了解程序集之间的 internal 关系,从而可以生成出更加符合预期的代码 本文所有代码放在 github 和 gitee 上,可以通过以下方式获取整个项目的代码创建一个空文件夹

22620

C# 9.0 中的新增功能

遗憾的是,C# 强制编写大量额外的代码创建不可变的引用类型。 记录为不可变的引用类型提供类型声明,该引用类型使用值语义实现相等性。...在 C# 9.0 中,已知创建对象的类型时,可在 new 表达式中省略该类型。...7、支持代码生成器 最后两项功能支持 C# 代码生成器。 C# 代码生成器是可编写的组件,类似于 roslyn 分析器或代码修补程序。...区别在于,代码生成器会在编译过程中分析代码并编写新的源代码文件。 典型的代码生成器会在代码中搜索属性或其他约定。 代码生成器使用 Roslyn 分析 API 读取属性或其他代码元素。...通过该信息,它将新代码添加到编译中。 源生成器只能添加代码,不能修改编译中的任何现有代码。 为代码生成器添加的两项功能是分部方法语法和模块初始化表达式的扩展。 首先是对分部方法的更改。

1.7K20

ClassDescription

那么我们可能需要把这部分代码直接做为配置文件提取出来。在每次修改后直接热更新进我们的程序。比如我们做低代码工具的时候可能需要根据用户的输入直接动态生成某些类型。...再比如我们做 BI 工具的时候可能需要根据用户选择的表直接动态生成 Entity 的类型。碰到类似需求的时候我们该怎么办?今天就来整理一下 .NET 平台关于动态代码生成的一些技术方案。...它提供了非常多的高级 API 来让用户在运行时分析代码生成程序集、类。所以它现在是运行时代码生成的首选项。下面让我们看看怎么使用 Roslyn 来实现动态生成一个 User class 。...通过以上代码我们可以发现使用 Roslyn 来动态生成代码的难度其实要比 Emit 简单不少。...如果你现在有动态代码生成的需求,那么 Roslyn 是你的最佳选择。 未完待续 除了以上 3 种代码生成技术,其实还有一种代码生成技术: Source Generator 。

52120

MSBuildRoslyn 和 NuGet 的 100 个坑

MSBuild 不愧是强大的编译器,它提供的扩展机制让你几乎可以编译任何类型的文件或项目;Roslyn 是全新编写的一套编译器,不过它保留了 MSBuild 的大部分机制;NuGet 是 .NET 生态系统中的包管理机制...系列博客 这是兄弟篇中的一篇,关于 MSBuild/Roslyn 和 NuGet 的 100 个坑: MSBuild/Roslyn 和 NuGet 的 100 个坑 由于这篇博客是大量坑的记录,所以是它建立在你已经对...MSBuild/Roslyn 和 NuGet 有一些了解的基础之上的。...将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成 Sdk 风格的 csproj 一文讲述了如何为项目文件添加 Sdk 属性,以便项目能够体验到最新的 Microsoft.NET.Sdk 编译体验...但是,只有使用了 Sdk 风格的 csproj 文件才会在执行了此命令后重新生成正确的包引用缓存文件;原来的格式并不会生成此文件,也就是说,无法修复。

30530

使用 Source Generator 在编译你的 .NET 项目时自动生成代码

本文将带你为你的某个库添加自动生成代码的逻辑。 本文以 dotnetCampus.Ipc 项目为例,来说明如何为一个现成的 .NET 类库添加自动生成代码的功能。...: 开始编写一个基本的代码生成器 使用代码生成生成需要的代码代码生成器加入到现有的 NuGet 包中 调试代码生成器 一个基本的代码生成创建一个项目,例如 dotnetCampus.Ipc.Analyzers...接着创建一个代码生成器类: 1 2 3 4 5 6 7 8 9 10 11 [Generator] public class ProxyJointGenerator : ISourceGenerator...而我在 dotnetCampus.Ipc 库中编写的生成代码会稍微复杂一点,会根据项目中标记了 IpcPublic 的类的代码动态生成对这个类的代理访问和对接代码,使用的是 Roslyn 进行语义分析。...这里只介绍创建代码分析器的一般方法,更多生成代码可以前往仓库浏览:dotnetCampus.Ipc 项目。

43830

.NET Core中使用Razor模板引擎

它也不完全类似于ASPX,因为它把那些比较笨重的占位符替换成@符号接表达式或者普通的控制块。因为不需要特殊的结束标记,所 以Razor最终的代码很简练。   ...一般情况下使用Razor作为视图引擎要实现如下步骤:   (1)读取模板文件 -> (2)生成Raozr的C#代码 -> (3)使用Roslyn编译代码生成程序集 -> (4)动态加载程序集 -> (5...GeneratorResults类型的结果,从而可以得知生成过程是否成功,错误在位置等信息。...3.编译模板 一般Razor的C#代码生成后,都是通过CodeDom来生成和编译代码的;.NET开源后,我们又多了一个强大的选择Roslyn , Roslyn也是支持.NET Core的,并且在整个....NET平台中,扮演着非常重要的角色,小到这种视图代码编译,大到整个项目的编译场景都有Roslyn的身影。

2.2K30

使用 Roslyn 对 C# 代码进行语义分析

Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。以至于我们只需要编写很少量的代码便能够分析我们的源代码。之前我写过一些使用 Roslyn 进行语法分析的文章。...使用语法分析,可以轻松为代码编写提供各种错误报告以及修改代码(见这里)。而使用语义分析,你可以像在运行时使用反射一样,在编译时访问源代码中的各种类型、属性、方法等,特别适合用来分析引用、生成代码等。...---- 本文将以 dotnetCampus.Ipc 项目里的自动生成 IPC 代理类型作为示例,来介绍如何使用 Roslyn 进行语法分析。本文会更偏碎片化。...来追踪项目的 API 改动,帮助保持库的 API 兼容性 - walterlv 可参考:使用 Roslyn 分析代码注释,给 TODO 类型的注释添加负责人、截止日期和 issue 链接跟踪 - walterlv...如果你正在编写代码生成器(Generator) 代码生成器的入口方法带有一个 GeneratorExecutionContext 类型的参数,而它直接就有我们需要的两种对象。

35820

为 IIncrementalGenerator 增量 Source Generator 源代码生成项目添加单元测试

本文属于 IIncrementalGenerator 增量 Source Generator 源代码生成入门系列博客,本文将和大家介绍如何为代码生成项目添加单元测试 添加单元测试的作用不仅可以用来实现通用的单元测试提高质量的功能...以下例子将创建名为 GeneratorTests 的单元测试用来演示如何对源代码生成进行测试或调试 新建 GeneratorTests 类型,先添加辅助的方法,代码如下 private static...} } 通过以上代码就可以在单元测试里面定义多个不同的输入代码源,从而使用不同的代码输入源进行测试或调试源代码生成项目 接下来创建用来测试的 CodeCollectionIncrementalGenerator...返回自身类型在这里不是为了方便做链调用,而是使用不可变思想,即任何的更改都会创建出新的对象,不会对原有的对象进行更改。...不可变思想在 Roslyn 里贯穿实现,从而造就了 Roslyn 如此复杂却又方便进行调试。

10810

从零开始学习 dotnet 编译过程和 Roslyn 源码分析

性能数据 SourceFusion 的其中一个用途是收集原本会通过反射收集的类型信息。...: Roslyn 使用 Target 替换占位符方式生成 nuget 打包 - 林德熙 Roslyn 通过 Target 修改编译的文件 - 林德熙 将 .NET Core 项目打一个最简单的 NuGet...源码包,安装此包就像直接把源码放进项目一样 - 吕毅 Roslyn 如何基于 Microsoft.NET.Sdk 制作源代码包 - 林德熙 Roslyn 基础 Roslyn 由于其丰富且易用的 API...推荐的入门文章有: Roslyn 入门:使用 Visual Studio 的语法可视化(Syntax Visualizer)窗格查看和了解代码的语法树 - 吕毅 Roslyn 静态分析 - 林德熙 Roslyn...入门:使用 Roslyn 静态分析现有项目中的代码 - 吕毅 Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码 - 吕毅 额外的,你可以阅读更多 Roslyn

24740

.NET平台系列7 .NET Core 体系结构详解

【底层】编译器 Roslyn   .NET Compiler Platform (项目代码Roslyn) s是一个开源的跨平台源代码编译器。...它是将 .NET平台的编译架构标准化的平台,它可提供程序管理工具 (集成开发环境) 相当多的情报,用以发展有助于编写程序与管理程序结构所需要的功能,例如类型信息、语法结构、参考链接、语义、编译器、自动化...UWP(用于创建Windows10 App) 等。...Roslyn 编译原理 Roslyn编译器用于将 C#、F#或VB.NET 代码编译为程序集(Assembly),它的编译过程是一个管道式的处理过程,一共包含4个步骤,具体过程见下图。 ?...(2) Declaration(声明)   为代码生成元数据(metadata),元数据是一个数据表的集合,描述了在当前代码中定义的数据类型和成员,同时也描述了引用的类型及成员。

97520
领券