本文将教大家如何从零开始开发一个基于 Roslyn 的 C# 源代码分析器 Analyzer 和修改器 CodeFixProvider。...无论哪一种,你都可以在支持 Roslyn 分析器扩展的 IDE(如 Visual Studio)中获得如下面动图所展示的效果。...开发准备 安装 Visual Studio 扩展开发工作负载 你需要先安装 Visual Studio 的扩展开发工作负载,如果你还没有安装,那么请先阅读以下博客安装: 如何安装和准备 Visual...如下图所示: 你可能会觉得有些不满,看起来似乎只有我们写的那些标题和描述在工作。...我将在其他的博客中说明如何编写和使用分析器项目的单元测试。
本文将基于 Roslyn 开发代码分析器,要求所有的 TODO 注释具有可被跟踪的负责人等信息。...预备知识 如果你对基于 Roslyn 编写分析器和代码修改器不了解,建议先阅读我的一篇入门教程: 基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NET/C# 源代码分析器...Analyzer 和修改器 CodeFixProvider - walterlv 分析器 我们先准备一些公共的信息: namespace Walterlv.Demo { internal static.../// public const string TodoMustBeTracked = "WAL302"; } } 在后面的代码分析器和修改器中,我们将都使用此公共的字符串常量来作为诊断...我们从语法树的 DescendantTrivia 方法中可以拿到文档中的所有的 Trivia 然后过滤掉获得其中的注释部分。
Roslyn简介 Roslyn是C#和Visual Basic编译器的开源实现,具有用于构建代码分析工具的API表面。Roslyn还提供可供IDE使用的语言服务,例如重构、代码修复或编辑并继续。...Roslyn分析器 Roslyn 分析器允许您使用 Roslyn 中的数据来检查代码以检测问题。分析器可以直接在编辑器中添加错误、警告或波浪线。...LanguageNames.CSharp, Name = nameof(MyRoslynCodeFixProvider)), Shared] public class MyRoslynCodeFixProvider : CodeFixProvider...// 将类名转换为全大写 var newName = identifierToken.Text.ToUpperInvariant(); // 获取语义模型,用来理解代码中的符号和上下文...semanticModel.GetDeclaredSymbol(typeDecl, cancellationToken); // 获取原始的解决方案(Solution),包含项目的所有代码和引用
而使用语义分析,你可以像在运行时使用反射一样,在编译时访问源代码中的各种类型、属性、方法等,特别适合用来分析引用、生成代码等。当然,实际项目里面将两者结合起来可以做到更多的效果。...关于代码分析器(Analyzer)和修改器(CodeFix)可以参考我之前的这些博客: 可参考:基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NET/C# 源代码分析器...Analyzer 和修改器 CodeFixProvider - walterlv 可参考:使用基于 Roslyn 的 Microsoft.CodeAnalysis.PublicApiAnalyzers...来追踪项目的 API 改动,帮助保持库的 API 兼容性 - walterlv 可参考:使用 Roslyn 分析代码注释,给 TODO 类型的注释添加负责人、截止日期和 issue 链接跟踪 - walterlv...例如,拿到一个语法树(SyntaxTree)中的类型定义,可以用下面的方法: 1 2 3 4 // 遍历语法树中的所有节点,找到所有类型定义的节点。
C#自定义控件—指示灯 https://www.cnblogs.com/guoenshuo/p/18397557 本文介绍了如何在C#中利用GDI绘制指示灯控件。...提供了GitHub和Gitee项目地址以供访问和下载。...C#自定义控件—流动管道 https://www.cnblogs.com/guoenshuo/p/18391637 这篇文章介绍了如何在C#中绘制一个动态流动管道,包括管道的渐变色矩形和半圆的绘制,以及流动条的绘制方法...使用 Roslyn 分析器和修复器对.cs源代码添加头部注释 https://www.cnblogs.com/vipwan/p/18401835 本文介绍如何使用Roslyn的CodeFixProvider...和DiagnosticAnalyzer来实现C#文件头部注释功能。
但是,不需要终端用户预览版,可以独立于Visual Studio在自己的应用程序中使用Roslyn API。 API 层 Roslyn由两个主要的API层组成——编译器API和工作区API。...使用工作区 工作区层是对整个解决方案进行代码分析和重构的起点。...在该层中,工作区 API 帮助您将解决方案中所有项目的信息组织成单一的对象模型,为您提供直接访问编译器层对象模型(如源代码文本、语法树、语义模型和编译)的能力,无需解析文件、配置选项或管理项目间的依赖关系...工作区提供对解决方案的当前模型的访问。当宿主环境发生变化时,工作区会触发相应的事件,并更新CurrentSolution属性。...5.png 总结 Roslyn 提供了一套编译器 API 和工作区 API,可以提供有关您的源代码的丰富信息,并与 C# 和 Visual Basic 语言完全兼容。
本文告诉大家如何在 Rosyln 编译一个文件,获得这个文件的类的命名空间 在 C# 代码里面,大部分的代码都是在开始定义了 using 引用命名空间,本文将告诉大家如何使用 Roslyn 分析获取类文件里面引用的命名空间...在开始之前,先使用 NuGet 安装必要的库,如 Microsoft.CodeAnalysis.Compilers 库。...使用继承 CSharpSyntaxWalker 的类作为辅助类,通过访问者模式的方法去读取,就是 Roslyn 开发推荐的方法 调用 Visit 方法就可以开始进行语法分析,或者进行语法修改添加代码等...VisitUsingDirective 将会进来 6 次,分别是以上的各个 using 语句 详细还请拉下代码,在 VisitUsingDirective 方法添加断点 本文所有代码放在 github 和...请看 手把手教你写 Roslyn 修改编译 本文会经常更新,请阅读原文: https://blog.lindexi.com/post/Roslyn-%E5%A6%82%E4%BD%95%
Roslyn 如何使用 MSBuild Copy 复制文件 本文告诉大家如何在 MSBuild 里使用 Copy 复制文件 Roslyn 使用 Target 替换占位符方式生成 nuget 打包 本文告诉大家如何编写在编译过程修改打包文件...只需要在项目文件夹,或者磁盘的文件夹,如 E:\ 放下本文提供的 Directory.Build.props 文件,整个文件夹内的控制台项目就会输出 林德熙是逗比 想要知道是怎么做的,请看下面 Roslyn...Roslyn 通过 nuget 统一管理信息 在日常的开发中,如果需要发布多个库,多个库之间的版权和作者等信息都是相同的。如果需要每次更改信息都打开项目进行编辑,这个效率是很低的。...Roslyn 节点的 Span 和 FullSpan 有什么区别 本文告诉大家在使用 Roslyn 分析代码时,使用的 Span 和 FullSpan 有什么区别 Roslyn 在项目文件使用条件判断...本文告诉大家如何在项目文件通过不同的条件使用不同的方法运行
引言 在现代软件开发中,编译器不仅仅是将源代码转换为目标代码的工具,它还承担着更多职责,如代码分析、重构建议和错误检测等。...语义模型(Semantic Model) :提供关于类型、符号和绑定的信息。 工作区(Workspace) :管理项目和解决方案的上下文。...诊断(Diagnostics) :编译器生成的错误和警告信息。 安装和配置 要开始使用 Roslyn,首先需要安装 NuGet 包。...高级应用:代码生成和修改 Roslyn 不仅可以解析和分析代码,还可以生成和修改代码。...结论 Roslyn 编译器平台为 C# 和 VB.NET 开发者提供了强大的工具,不仅可以解析和分析代码,还可以生成和修改代码。
引言 上一篇中.Net 编译器平台 --- Roslyn,介绍了Roslyn的各项功能,包括公开API,使用语法,使用语义,使用工作区等功能。...但是,您可以参考 Microsoft 的官方文档和示例来了解如何使用脚本 API 并查看相关源代码。...脚本 API 无法在通用 Windows 应用程序和 .NET Native 中使用,因为应用程序模型不支持在运行时加载生成的代码。...如果程序集在内存中(包括在交互式窗口中执行示例时),脚本将无法访问该类型。请参阅此处的问题。...API 集合的访问。
Roslyn 的设计理念 Roslyn 一开始就将漂亮的 API 作为目标的一部分,同时还要非常高的性能;所以 Roslyn 的开发团队需要找到一种特殊的数据结构来描述语言(如 C#)的语法。...这种数据结构要满足这些期望的要求: 不可变(Immutable) 树的形式 可以容易地访问父节点和子节点 可以非常容易地将任何一个节点对应到源代码文件的一段文本区间 可重用(Persistent) 最后一个的英文说法是...Roslyn 的设计中有一个重要的业务需求,希望能够分析源代码文件并在开发者编辑的过程中不断提供建议。也就是说,当我们连续不断地去修改源代码中的文本内容时,Roslyn 也需要具备很高的性能。...既然要容易地访问到父节点和子节点,那么我们是先构造父节点还是子节点呢?如果先构造父节点,那子节点还没有创建出来;而先构造子节点,那父节点就没构造出来。...这两棵树设计起来协同工作,前者负责解决 Roslyn 语法分析的性能问题,后者负责对开发人员提供友好的 API 调用。
要了解有关我们最喜欢的 Roslyn 分析仪的详细信息,请访问我们的 Roslyn 分析器 GitHub 仓库。...表示警告 圆圈中的"x"表示严重 浅色背景上圆圈中的"i"表示隐藏的严重 圆圈中的"*"表示忽略的诊断 ? 然后,可以从解决方案资源管理器设置规则集严重性。在解决方案资源管理器中,展开依赖项和分析器。...如果将规则严重性设置为警告,则会在代码中收到该特定规则集的警告。 ? 现在,您已经了解了分析器的工作原理,您可以提高工作效率,更快地编写更好的代码!...问:我应该使用 Roslyn 分析器还是 .editorconfig 规范代码样式? 答:Roslyn 分析器和 .editorconfig 文件是齐头并进的。...在 .editorconfig 文件或文本编辑器选项页上定义代码样式时,实际上正在配置内置于 Visual Studio 中的 Roslyn 分析器。 问:分析器在持续集成 (CI) 生成中工作吗?
此窗口提供了一种替代环境,以便在开发中的项目上来执行个别语句,并直接得到结果。 Compilify使.NET编译器成为完全便携式的,而且可通过快捷的接口访问,从而促进共享和协作。...执行结果被序列化,并返回给工作服务器。我在单独的线程中执行这些工作,以便万一耗时太久(目前设置的时间限制是5秒)我可以取消处理。...用于AppHarbor的附加组件New Relic确实可以让我轻松监视Web服务器和后台工作服务器的负载。...译注 [1] Roslyn CTP,传统上,编译器都是黑盒——源代码从一端进入,然后对象文件或程序集从另一端出来。Roslyn项目通过开放VB和C#编译器改变了这种模型。...通过微软的“Roslyn”CTP(即Community Technology Preview,社区技术预览版)版可预览新的语言对象模型,该模型用于代码生成、分析和重构,还有即将到来的脚本支持、及C#与VB
当然,如果你只是做一些特定的事情,当然不需要安装这么全的 NuGet 包,像 Roslyn 静态分析 - 林德熙 的 demo 和 Roslyn 编译与执行 - 吕毅 中的教程就不需要安装所有 NuGet...在访问者模式中,由于 C# 的语法在一个 C# 版本发布之后就会确定,其中各种各样类型的语法对应访问者模式中的各种不同类型的数据,Roslyn 为我们构建的语法树对应访问者模式中需要访问的庞大的数据结构...访问泛型参数 现在,我们继续在之前打开解决方案和项目文件的代码后面增添代码: // 从我们一开始打开的项目文件中获取语法树。...访问泛型参数。其中 1 和 3 写在一个方法中,2 是一个新类。 分析这个泛型参数 直到现在,我们所写的任何代码都还只是为了使使用 Roslyn API 的代码能够跑起来,没有进行任何实质上的分析。...TypeParameterVisitor VisitTypeParameterList(用于遍历和修改语法树中的泛型参数列表) 以上便是分析和修改 Roslyn 语法树的简单实例了,我将整个
这个版本包括对 C# 11 必要成员的支持,对 Roslyn 模式检测的更新,以及其他错误和改进。 文章、幻灯片等。...用 Roslyn 检测和删除死代码 https://jason-ge.medium.com/detect-and-remove-dead-code-with-roslyn-26e741b20d3c 关于如何使用...Roslyn 来检测和删除死代码(未使用的类型)的文章。...,目前以资助如 FluentValidation 等项目。...https://twitter.com/JamesMontemagno/status/1599101553813880839 image-20221210145036075 ---- 讨论 C#语言设计和工作组会议记录的可用性
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何判断两个程序集之间是否存在 InternalsVisibleTo 关系...InternalsVisibleTo 关系 这个 GivesAccessTo 方法可以获取到当前的程序集对给定的程序集参数是否为 internal 可见 以下是详细的例子代码 本文的例子的任务是编写一个 Roslyn...App 和 Lib1 和 Lib2 项目 在 Lib1 和 Lib2 里面存放一些 internal 的类型,这两个项目将被当成类库项目被 App 项目所引用。...回到咱这个例子的任务上,就是在 Analyzers 分析器项目编写代码,分析 App 项目所引用的程序集里面的存在哪些程序集对 App 程序集设置了 internal 可见 完成准备工作之后,接下来开始本文的核心逻辑编写.../lindexi_gd.git git pull origin e0748230af39e712b77e72f2dbb6bef4453b0c84 以上使用的是 gitee 的源,如果 gitee 不能访问
,这是一个基于Roslyn和AvalonEdit构建的轻量级C#编辑器,支持跨平台运行。...文章详细介绍了钩子的分类,如键盘钩子、鼠标钩子和外壳钩子,以及它们的主要功能。钩子的工作机制通过Windows消息处理实现,允许开发者自定义处理逻辑。...以请假审批流程为例,阐述了如何在主管审核与经理审核之间使用书签控制流程进展。创建书签可通过context.CreateBookmark实现,并记录多种信息,如唯一id和相关性id。...如何在 ASP.NET Core 中实现速率限制?.../ 介绍在 .NET 9 中增强的适用于 Windows 窗体的 Roslyn 分析器。
不过,在那篇文章中,我写了一个应用程序来完成这样的事情。我在另一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包 中说到我们可以将这样的应用程序打包成一个 NuGet 工具包。...于是,我想到可以使用 Roslyn。在项目中编写一段转换代码,我们使用通用的方式去编译和执行这段代码,以便完成各种各样日益增加的类型转换需求。...准备工作 与之前在 Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码 中的不同,我们这次无需打开解决方案或者项目,而是直接寻找并编译源代码文件。...准备一份用于编译和执行代码文件 我直接使用 生成代码,从 T 到 T1, T2, Tn —— 自动生成多个类型的泛型 这篇文章中的例子。把其中最关键的文件拿来用于编译和生成试验。...如果你想实现如本文开头所说的更通用的效果,欢迎发动你的大脑让想象力迸发。当然,如果你确实想不出来,欢迎在下方评论,我将尽快回复。
而基于 dotnet 的上层应用的框架,如 WPF 和 WinForms 和 ASP.NET Core 等都是基于 MIT 协议开源的 在开源的世界里面,采用 MIT 协议是最友好的,意味着使用方无任何版权费用问题...此时可以加上 dotnet runtime 仓库的截图 现在有大量的上层应用框架都选择了开源贡献,如整个国内的 dotnet 组织 https://github.com/dotnetcore/ 和老张的包含了一些新鲜的...在 2020 年,其实自己基于开源的 Roslyn 定制一个属于自己的编译器没有想象中那么难,而 Roslyn 编译器的开源协议是最友好的 MIT 协议,这意味着咱可以对整个开源仓库进行自由的更改 (这将允许任何人任何组织和企业任意处置...唯一的限制是,软件中必须包含上述版 权和许可提示,后者协议将会除了为用户提供版权许可之外,还有专利许可,并且授权是免费,无排他性的(任何个人和企业都能获得授权)并且永久不可撤销,用户使用完全不用担心收费问题和版权问题...2014年以来已经有众多知名公司加入.NET基金会, 仅在平台项目中,.NET平台上有大量贡献者其实不在Microsoft工作。
Roslyn 是微软公司开源的 .NET 编译器。编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。...、Microsoft.CodeAnalysis.CSharp、Microsoft.CodeAnalysis.VisualBasic组件以后, 便可以在C#项目和VB项目中使用Roslyn的API。...Execute方法来实现在项目的代码实现期动态的编译我们输入的C#代码, 编译后的代码似乎并不嵌入到原代码(编译以后)中,所以我们需要指定引入代码中需要的Assembly和Namespace, AddReferenceAndNameSpace...下面写个简单的测试代码来测试上面的编译器是否可以正常工作。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
领取专属 10元无门槛券
手把手带您无忧上云