首页 > 编程语言 >(一)如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

(一)如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

时间:2023-03-31 11:34:57浏览次数:47  
标签:C# 代码 提示 编译器 VS Roslyn NET

原文:(一)如何利用C# Roslyn编译器写一个简单的代码提示/错误检查? - simol - 博客园 (cnblogs.com)

OK, 废话不多说,这些天在写C#代码时突然对于IDE提示有了一些想法,之前也有了解过,不过并没有深入。

先看个截图:

 

 

 一段再简单不过的代码了,大家注意看到 count 字段下面的绿色波浪线了吗,我们通常为理解一个 warning ,鼠标移上去:

 

 

 提示“声明了该字段但没有使用过” 当然,这对项目代码编译没有什么影响。不过,我想了一下,如果我们可以重写IDE的编译器,把我们的一些规则写进去,对于团队

的代码review其实是很高效的一件事情。我们通常的代码review会有滞后,都是通过提交PR或代码评审,如果我们把这个检查在开发人员写代码的时候第一时间提示出来或给error提示,实现所见即所得,应该是一件很值得做的事情吧。

言归正传,我们要实现这一目的,“Roslyn” 就出场了,可以理解为 .NET Compiler Platform,一个.NET编译平台。以前我们看“Roslyn” 是这样的:

 

 

 源码 -> 编译-> 程序集, 然而这里的编译其实是不透明的,也称“黑盒状态”。但微软开源之后,我们了解里面其实有这些细节:

 

 

 

API包括Syntax、Symbol等 ,今天不细讲这些内容,后面再写分析器的时候我会给大家罗列出来用法。

下面我们看如何准备环境(安装Roslyn):

1. 安装VS要勾选.NET Compiler Platform

 

 

 2.VS2019 16.3以上版本 .NET Framework4.8 (老版本的vs似乎也可以 我没有尝试过)

3. 打开VS,新建项目-》 选择Analyzer with Code Fix 模板,如下图:

 

 

 

4. 项目创建后,可以看到右边Solution窗口有三个项目:

 

 

 正常情况下默认启动项目为 Analyzer1.Vsix (VS扩展插件 不了解的同学可以去学习一下vs自定义插件)

5. 我们直接暴力一点,F5运行调试,项目运行后,会重新启动一个新的VS实例:

 

 

 

 

 细心的同学可以看到,此时我的窗口是启动了俩个VS, 一个可以理解为“母体”,一个则是母体Copy出来的一份(这样形容应该好理解)

6. 在创建出来的VS实例窗口,我们还是按照之前的做法,新建一个控制台应用程序:

 

 

可以看到实例VS创建出来的控制台应用程序,类名 Program有提示,意思是不能小写,然后旁边有个黄色的灯泡,大概可以猜出来点击黄色灯泡可以解决

当前提示的问题,应该就是转换为大写。那么,这个简单的检查代码是如何写出来的呢?

7. 调试“母体”,在母体VS 类名为Analyzer1Analyzer 的静态方法AnalyzeSymbol打断点:

 

 

打完断点后,我在实例的VS窗口删除了类Program 的最后一个字母m,母体断点被触发,这段代码可以看到就是一个简单的检查判断,最后创建一个Rule

报给给前端的编辑器。基本上后续重写编译平台都是使用Diagnostic.Create方法,不同的则是你要写特定的逻辑来检查你团队的代码。

当然,这里分为俩个部分,一个是诊断(IDE提示,如绿色波浪线),一个是解决(黄色小灯泡里实现解决代码)

 

今天大概就是这样一个简单的Demo,其实里面挺复杂,后续会给大家主角讲一下AnalyzeSymbol类里的一些模型以及主要API.

PS:Roslyn源码已经在github上公开,感兴趣的可以看看源码,地址:https://github.com/dotnet/roslyn 里面代码还是很有价值的。

另外,提供一个Roslyn学习地址:https://github.com/ironcev/awesome-roslyn

 

标签:C#,代码,提示,编译器,VS,Roslyn,NET
From: https://www.cnblogs.com/bruce1992/p/17275748.html

相关文章

  • Asp.Net Core 动态生成WebApi
    在WebApi架构体系中,一般需要先编写应用服务实现,再通过编写Controller来实现应用服务的Web接口。Controller中的代码作用仅仅是调用Service的方法,将Service提升为Web接口,其实完全可以通过动态生成WebApi来减少编码工作。在.Net示例项目ABP中已经实现了动态生成WebApi的功能,Panda.Dy......
  • ChatGPT 微信接入 C#完整源码
    1.无需搭建服务器,操作极其简单。  2.winform运行程序扫码进行微信登录,勾上自动回复,就可以充当机器人调用chatGPT可实现自动回复,可以申请小号操作。  3.可以识别会话消息和群聊消息,拉入群聊@机器人可以进行群聊的消息回复,可以得到@自己的回复消息。4.代码是完整的也......
  • windows+eclipse+cygwin+cdt+ndk
    windows系统上安装与使用AndroidNDKr5NDK&cygwin邮箱里有一:什么是NDK?NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等......
  • 安装罗克韦尔软件,总是提示:未安装microsoft FRAMEWORK 3.5 要如何解决
    1、点击setup文件,总提示如下弹窗  2、先关闭弹窗3、打开电脑控制面板4、找到程序与功能5、点击启用或关闭windows功能 6、   7、电脑开始自动安装FRAMEWORK3.5(前提是电脑必须连接互联网) 8、FRAMEWORK3.5安装完成,提示windows已完成请求的更改   9......
  • Elasticsearch.Net+Nest基本用法
    基本用法安装Nest(安装后默认会装上Elasticsearch.Net),注意:版本尽量选择跟ES版本一致的批量初始化数据到ESusingNest;try{//测试环境配置SSL证书需要的设置ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls12|SecurityProtocolType.Tls11......
  • oracle 查看表空间实际占用情况
    SELECTtablespace_name表空间名,round(SUM(bytes)/1000/1000/1000,2)alloc_bytes,round(SUM(maxbytes)/1000/1000/1000,2)maxbytesFROMdba_data_filesGROUPBYtablespace_name;SELECTtablespace_nam......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-智能编写Python注释文档字符串从0到1快速入门
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-类比语句智能生成从0到1快速入门——官网推荐
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-自然语言智能获取颜色从0到1快速入门——官网
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • oracle 优化监控相关
    SELECTsn.username,m.SID,sn.SERIAL#,m.TYPE,DECODE(m.lmode,0,'None',1,'Null',2,'RowShare',3,'RowExcl.',4,......